1 #ifndef LINUXRENDERERGLES_RENDERER
2 #define LINUXRENDERERGLES_RENDERER
5 * Copyright (C) 2010 Team XBMC
8 * This Program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
13 * This Program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with XBMC; see the file COPYING. If not, write to
20 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21 * http://www.gnu.org/copyleft/gpl.html
27 #include "xbmc/guilib/FrameBufferObject.h"
28 #include "xbmc/guilib/Shader.h"
29 #include "settings/VideoSettings.h"
30 #include "RenderFlags.h"
31 #include "guilib/GraphicContext.h"
32 #include "BaseRenderer.h"
33 #include "xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h"
38 namespace Shaders { class BaseYUV2RGBShader; }
39 namespace Shaders { class BaseVideoFilterShader; }
46 #define ALIGN(value, alignment) (((value)+((alignment)-1))&~((alignment)-1))
47 #define CLAMP(a, min, max) ((a) > (max) ? (max) : ( (a) < (min) ? (min) : a ))
51 #define IMAGE_FLAG_WRITING 0x01 /* image is in use after a call to GetImage, caller may be reading or writing */
52 #define IMAGE_FLAG_READING 0x02 /* image is in use after a call to GetImage, caller is only reading */
53 #define IMAGE_FLAG_DYNAMIC 0x04 /* image was allocated due to a call to GetImage */
54 #define IMAGE_FLAG_RESERVED 0x08 /* image is reserved, must be asked for specifically used to preserve images */
55 #define IMAGE_FLAG_READY 0x16 /* image is ready to be uploaded to texture memory */
56 #define IMAGE_FLAG_INUSE (IMAGE_FLAG_WRITING | IMAGE_FLAG_READING | IMAGE_FLAG_RESERVED)
112 extern YUVRANGE yuv_range_lim;
113 extern YUVRANGE yuv_range_full;
114 extern YUVCOEF yuv_coef_bt601;
115 extern YUVCOEF yuv_coef_bt709;
116 extern YUVCOEF yuv_coef_ebu;
117 extern YUVCOEF yuv_coef_smtp240m;
123 class CLinuxRendererGLES : public CBaseRenderer
126 CLinuxRendererGLES();
127 virtual ~CLinuxRendererGLES();
129 virtual void Update(bool bPauseDrawing);
130 virtual void SetupScreenshot() {};
132 bool RenderCapture(CRenderCapture* capture);
135 virtual bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags);
136 virtual bool IsConfigured() { return m_bConfigured; }
137 virtual int GetImage(YV12Image *image, int source = AUTOSOURCE, bool readonly = false);
138 virtual void ReleaseImage(int source, bool preserve = false);
139 virtual unsigned int DrawSlice(unsigned char *src[], int stride[], int w, int h, int x, int y);
140 virtual void FlipPage(int source);
141 virtual unsigned int PreInit();
142 virtual void UnInit();
143 virtual void Reset(); /* resets renderer after seek for example */
145 virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255);
148 virtual bool SupportsMultiPassRendering();
149 virtual bool Supports(ERENDERFEATURE feature);
150 virtual bool Supports(EINTERLACEMETHOD method);
151 virtual bool Supports(ESCALINGMETHOD method);
153 #ifdef HAVE_LIBOPENMAX
154 virtual void AddProcessor(COpenMax* openMax, DVDVideoPicture *picture);
156 #ifdef HAVE_VIDEOTOOLBOXDECODER
157 virtual void AddProcessor(CDVDVideoCodecVideoToolBox* vtb, DVDVideoPicture *picture);
160 virtual void Render(DWORD flags, int index);
162 virtual void ManageTextures();
163 int NextYV12Texture();
164 virtual bool ValidateRenderTarget();
165 virtual void LoadShaders(int field=FIELD_FULL);
166 void SetTextureFilter(GLenum method);
167 void UpdateVideoFilter();
170 void (CLinuxRendererGLES::*m_textureUpload)(int index);
171 void (CLinuxRendererGLES::*m_textureDelete)(int index);
172 bool (CLinuxRendererGLES::*m_textureCreate)(int index);
174 void UploadYV12Texture(int index);
175 void DeleteYV12Texture(int index);
176 bool CreateYV12Texture(int index);
178 void UploadCVRefTexture(int index);
179 void DeleteCVRefTexture(int index);
180 bool CreateCVRefTexture(int index);
182 void CalculateTextureSourceRects(int source, int num_planes);
185 void RenderMultiPass(int index, int field); // multi pass glsl renderer
186 void RenderSinglePass(int index, int field); // single pass glsl renderer
187 void RenderSoftware(int index, int field); // single pass s/w yuv2rgb renderer
188 void RenderOpenMax(int index, int field); // OpenMAX rgb texture
189 void RenderCoreVideoRef(int index, int field); // CoreVideo reference
191 CFrameBufferObject m_fbo;
193 int m_iYV12RenderBuffer;
194 int m_NumYV12Buffers;
195 int m_iLastRenderBuffer;
201 GLenum m_textureTarget;
202 unsigned short m_renderMethod;
203 RenderQuality m_renderQuality;
204 unsigned int m_flipindex; // just a counter to keep track of if a image has been uploaded
205 bool m_StrictBinding;
207 // Raw data used by renderer
225 typedef YUVPLANE YUVPLANES[MAX_PLANES];
226 typedef YUVPLANES YUVFIELDS[MAX_FIELDS];
235 unsigned flipindex; /* used to decide if this has been uploaded */
237 #ifdef HAVE_LIBOPENMAX
238 OpenMaxVideoBuffer *openMaxBuffer;
240 #ifdef HAVE_VIDEOTOOLBOXDECODER
241 struct __CVBuffer *cvBufferRef;
246 typedef YUVBUFFER YUVBUFFERS[NUM_BUFFERS];
248 // YV12 decoder textures
249 // field index 0 is full image, 1 is odd scanlines, 2 is even scanlines
250 YUVBUFFERS m_buffers;
252 void LoadPlane( YUVPLANE& plane, int type, unsigned flipindex
253 , unsigned width, unsigned height
254 , int stride, void* data );
256 Shaders::BaseYUV2RGBShader *m_pYUVShader;
257 Shaders::BaseVideoFilterShader *m_pVideoFilterShader;
258 ESCALINGMETHOD m_scalingMethod;
259 ESCALINGMETHOD m_scalingMethodGui;
261 // clear colour for "black" bars
264 // software scale libraries (fallback if required gl version is not available)
265 DllSwScale *m_dllSwScale;
266 struct SwsContext *m_sw_context;
267 BYTE *m_rgbBuffer; // if software scale is used, this will hold the result image
268 unsigned int m_rgbBufferSize;
270 HANDLE m_eventTexturesDone[NUM_BUFFERS];
275 inline int NP2( unsigned x )