cosmetic: deleted some unused variables and functions
[xbmc:xbmc-antiquated.git] / xbmc / cores / VideoRenderers / LinuxRendererGL.h
1 #ifndef LINUXRENDERERGL_RENDERER
2 #define LINUXRENDERERGL_RENDERER
3
4 #ifdef HAS_SDL_OPENGL
5
6 #include "../../../guilib/FrameBufferObject.h"
7 #include "../../../guilib/Shader.h"
8 #include "../ffmpeg/DllSwScale.h"
9 #include "../ffmpeg/DllAvCodec.h"
10 #include "VideoShaders/YUV2RGBShader.h"
11 #include "VideoShaders/VideoFilterShader.h"
12 #include "../../settings/VideoSettings.h"
13 #include "RenderFlags.h"
14 #include "GraphicContext.h"
15
16 namespace Surface { class CSurface; }
17
18 using namespace Surface;
19 using namespace Shaders;
20
21 #define NUM_BUFFERS 3
22
23 #define MAX_PLANES 3
24 #define MAX_FIELDS 3
25
26 #undef ALIGN
27 #define ALIGN(value, alignment) (((value)+((alignment)-1))&~((alignment)-1))
28 #define CLAMP(a, min, max) ((a) > (max) ? (max) : ( (a) < (min) ? (min) : a ))
29
30 typedef struct YV12Image
31 {
32   BYTE *   plane[MAX_PLANES];
33   unsigned stride[MAX_PLANES];
34   unsigned width;
35   unsigned height;
36   unsigned flags;
37
38   unsigned cshift_x; /* this is the chroma shift used */
39   unsigned cshift_y;
40 } YV12Image;
41
42 #define AUTOSOURCE -1
43
44 #define IMAGE_FLAG_WRITING   0x01 /* image is in use after a call to GetImage, caller may be reading or writing */
45 #define IMAGE_FLAG_READING   0x02 /* image is in use after a call to GetImage, caller is only reading */
46 #define IMAGE_FLAG_DYNAMIC   0x04 /* image was allocated due to a call to GetImage */
47 #define IMAGE_FLAG_RESERVED  0x08 /* image is reserved, must be asked for specifically used to preserve images */
48 #define IMAGE_FLAG_READY     0x16 /* image is ready to be uploaded to texture memory */
49 #define IMAGE_FLAG_INUSE (IMAGE_FLAG_WRITING | IMAGE_FLAG_READING | IMAGE_FLAG_RESERVED)
50
51 struct DRAWRECT
52 {
53   float left;
54   float top;
55   float right;
56   float bottom;
57 };
58
59 enum EFIELDSYNC
60 {
61   FS_NONE,
62   FS_ODD,
63   FS_EVEN,
64   FS_BOTH
65 };
66
67 struct YUVRANGE
68 {
69   int y_min, y_max;
70   int u_min, u_max;
71   int v_min, v_max;
72 };
73
74 struct YUVCOEF
75 {
76   float r_up, r_vp;
77   float g_up, g_vp;
78   float b_up, b_vp;
79 };
80
81 enum RenderMethod
82 {
83   RENDER_GLSL=0x01,
84   RENDER_ARB=0x02,
85   RENDER_SW=0x04,
86   RENDER_VDPAU=0x08,
87   RENDER_POT=0x10
88 };
89
90 enum RenderQuality
91 {
92   RQ_LOW=1,
93   RQ_SINGLEPASS,
94   RQ_MULTIPASS,
95   RQ_SOFTWARE
96 };
97
98 #define PLANE_Y 0
99 #define PLANE_U 1
100 #define PLANE_V 2
101
102 #define FIELD_FULL 0
103 #define FIELD_ODD 1
104 #define FIELD_EVEN 2
105
106 extern YUVRANGE yuv_range_lim;
107 extern YUVRANGE yuv_range_full;
108 extern YUVCOEF yuv_coef_bt601;
109 extern YUVCOEF yuv_coef_bt709;
110 extern YUVCOEF yuv_coef_ebu;
111 extern YUVCOEF yuv_coef_smtp240m;
112
113 class CLinuxRendererGL
114 {
115 public:
116   CLinuxRendererGL();  
117   virtual ~CLinuxRendererGL();
118
119   virtual void GetVideoRect(RECT &rs, RECT &rd);
120   virtual float GetAspectRatio();
121   virtual void Update(bool bPauseDrawing);
122   virtual void SetupScreenshot() {};
123   virtual void SetViewMode(int iViewMode);
124
125   void CreateThumbnail(SDL_Surface * surface, unsigned int width, unsigned int height);
126
127   // Player functions
128   virtual bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags);
129   virtual bool IsConfigured() { return m_bConfigured; }
130   virtual int          GetImage(YV12Image *image, int source = AUTOSOURCE, bool readonly = false);
131   virtual void         ReleaseImage(int source, bool preserve = false);
132   virtual unsigned int DrawSlice(unsigned char *src[], int stride[], int w, int h, int x, int y);
133   virtual void         DrawAlpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride);
134   virtual void         FlipPage(int source);
135   virtual unsigned int PreInit();
136   virtual void         UnInit();
137   virtual void         Reset(); /* resets renderer after seek for example */
138
139   void AutoCrop(bool bCrop);
140   virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255);
141   RESOLUTION GetResolution();  
142
143   // Feature support
144   virtual bool SupportsBrightness();
145   virtual bool SupportsContrast();
146   virtual bool SupportsGamma();
147   virtual bool SupportsMultiPassRendering();
148
149 protected:
150   virtual void Render(DWORD flags, int renderBuffer);
151   virtual void CalcNormalDisplayRect(float fOffsetX1, float fOffsetY1, float fScreenWidth, float fScreenHeight, float fUserPixelRatio, float fZoomAmount);
152   void CalculateFrameAspectRatio(int desired_width, int desired_height);
153   void ChooseBestResolution(float fps);
154
155   ESCALINGMETHOD GetDefaultUpscalingMethod();
156   bool IsSoftwareUpscaling();
157   void InitializeSoftwareUpscaling();
158
159   virtual void ManageDisplay();
160   void CopyAlpha(int w, int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dst, unsigned char* dsta, int dststride);
161   virtual void ManageTextures();
162   void DeleteOSDTextures(int index);
163   void RenderOSD();
164   void DeleteYV12Texture(int index);
165   void ClearYV12Texture(int index);
166   virtual bool CreateYV12Texture(int index, bool clear=true);
167   void CopyYV12Texture(int dest);
168   int  NextYV12Texture();
169   virtual bool ValidateRenderTarget();
170   virtual void LoadShaders(int renderMethod=FIELD_FULL);
171   void LoadTextures(int source);
172   void SetTextureFilter(GLenum method);
173   void UpdateVideoFilter();
174
175   // renderers
176   //void RenderLowMem(DWORD flags);     // low mem renderer
177   void RenderMultiPass(DWORD flags, int renderBuffer);  // multi pass glsl renderer
178   void RenderSinglePass(DWORD flags, int renderBuffer); // single pass glsl renderer
179   void RenderSoftware(DWORD flags, int renderBuffer);   // single pass s/w yuv2rgb renderer
180   void RenderVDPAU(DWORD flags, int renderBuffer);      // render using vdpau hardware
181
182   CFrameBufferObject m_fbo;
183   CSurface *m_pBuffer;
184
185   int m_iYV12RenderBuffer;
186   int m_NumYV12Buffers;
187   int m_iLastRenderBuffer;
188
189   float m_fSourceFrameRatio; // the frame aspect ratio of the source (corrected for pixel ratio)
190   RESOLUTION m_iResolution;    // the resolution we're running in
191   float m_fps;        // fps of movie
192   RECT rd;          // destination rect
193   RECT rs;          // source rect
194   unsigned int m_iSourceWidth;    // width
195   unsigned int m_iSourceHeight;   // height
196
197   bool m_bConfigured;
198   bool m_bValidated;
199   bool m_bImageReady;
200   unsigned m_iFlags;
201   GLenum m_textureTarget;
202   unsigned short m_renderMethod;
203   RenderQuality m_renderQuality;
204   bool m_StrictBinding;
205
206   // Software upscaling.
207   int m_upscalingWidth;
208   int m_upscalingHeight;
209   YV12Image m_imScaled;
210   bool m_isSoftwareUpscaling;
211
212   // OSD stuff
213   GLuint m_pOSDYTexture[NUM_BUFFERS];
214   GLuint m_pOSDATexture[NUM_BUFFERS];
215   GLubyte* m_pOSDYBuffer;
216   GLubyte* m_pOSDABuffer;
217
218   float m_OSDWidth;
219   float m_OSDHeight;
220   DRAWRECT m_OSDRect;
221   int m_iOSDRenderBuffer;
222   int m_iOSDTextureWidth;
223   int m_iOSDTextureHeight[NUM_BUFFERS];
224   int m_NumOSDBuffers;
225   bool m_OSDRendered;
226
227   // Raw data used by renderer
228   YV12Image m_image[NUM_BUFFERS];
229   int m_currentField;
230   int m_reloadShaders;
231
232   typedef struct
233   {
234     GLuint id;
235     CRect  rect;
236
237     float  width;
238     float  height;
239
240     unsigned texwidth;
241     unsigned texheight;
242   } YUVPLANE;
243
244   typedef YUVPLANE           YUVPLANES[MAX_PLANES];
245   typedef YUVPLANES          YUVFIELDS[MAX_FIELDS];
246   typedef YUVFIELDS          YUVBUFFERS[NUM_BUFFERS];
247
248   // YV12 decoder textures
249   // field index 0 is full image, 1 is odd scanlines, 2 is even scanlines
250   YUVBUFFERS m_YUVTexture;
251
252   void LoadPlane( YUVPLANE& plane, int type
253                 , int width,  int height
254                 , int stride, void* data );
255
256   //BaseYUV2RGBGLSLShader     *m_pYUVShaderGLSL;
257   //BaseYUV2RGBARBShader      *m_pYUVShaderARB;
258   CShaderProgram        *m_pYUVShader;
259   BaseVideoFilterShader *m_pVideoFilterShader;
260   ESCALINGMETHOD m_scalingMethod;
261
262 //  /*
263   GLint m_brightness;
264   GLint m_contrast;
265   GLint m_shaderField;
266 //  */
267
268   // clear colour for "black" bars
269   float m_clearColour;
270
271   // software scale libraries (fallback if required gl version is not available)
272   DllAvUtil   m_dllAvUtil;
273   DllAvCodec  m_dllAvCodec;
274   DllSwScale  m_dllSwScale;
275   BYTE       *m_rgbBuffer;  // if software scale is used, this will hold the result image
276   int         m_rgbBufferSize;
277
278   HANDLE m_eventTexturesDone[NUM_BUFFERS];
279   HANDLE m_eventOSDDone[NUM_BUFFERS];
280
281 };
282
283
284 inline int NP2( unsigned x ) {
285 #if defined(_LINUX) && !defined(__POWERPC__)
286   // If there are any issues compiling this, just append a ' && 0'
287   // to the above to make it '#if defined(_LINUX) && 0'
288
289   // Linux assembly is AT&T Unix style, not Intel style
290   unsigned y;
291   __asm__("dec %%ecx \n"
292           "movl $1, %%eax \n"
293           "bsr %%ecx,%%ecx \n"
294           "inc %%ecx \n"
295           "shl %%cl, %%eax \n"
296           "movl %%eax, %0 \n"
297           :"=r"(y)
298           :"c"(x)
299           :"%eax");
300   return y;
301 #else
302     --x;
303     x |= x >> 1;
304     x |= x >> 2;
305     x |= x >> 4;
306     x |= x >> 8;
307     x |= x >> 16;
308     return ++x;
309 #endif
310 }
311 #endif
312
313 #endif