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