[ARM] Added neccessary GLES, EGL and other arm related files
[xbmc:xbmc-antiquated.git] / trunk / xbmc / cores / VideoRenderers / LinuxRendererGLES.h
1 #ifndef LINUXRENDERERGLES_RENDERER
2 #define LINUXRENDERERGLES_RENDERER
3
4 #if HAS_GLES == 2
5
6 #include "../../../guilib/FrameBufferObject.h"
7 #include "../../../guilib/Shader.h"
8 #include "../dvdplayer/Codecs/DllSwScale.h"
9 #include "../dvdplayer/Codecs/DllAvCodec.h"
10 #include "../../settings/VideoSettings.h"
11 #include "RenderFlags.h"
12 #include "GraphicContext.h"
13 #include "BaseRenderer.h"
14
15 class CBaseTexture;
16 namespace Shaders { class BaseYUV2RGBShader; }
17 namespace Shaders { class BaseVideoFilterShader; }
18
19 #define NUM_BUFFERS 3
20
21
22 #undef ALIGN
23 #define ALIGN(value, alignment) (((value)+((alignment)-1))&~((alignment)-1))
24 #define CLAMP(a, min, max) ((a) > (max) ? (max) : ( (a) < (min) ? (min) : a ))
25
26 #define AUTOSOURCE -1
27
28 #define IMAGE_FLAG_WRITING   0x01 /* image is in use after a call to GetImage, caller may be reading or writing */
29 #define IMAGE_FLAG_READING   0x02 /* image is in use after a call to GetImage, caller is only reading */
30 #define IMAGE_FLAG_DYNAMIC   0x04 /* image was allocated due to a call to GetImage */
31 #define IMAGE_FLAG_RESERVED  0x08 /* image is reserved, must be asked for specifically used to preserve images */
32 #define IMAGE_FLAG_READY     0x16 /* image is ready to be uploaded to texture memory */
33 #define IMAGE_FLAG_INUSE (IMAGE_FLAG_WRITING | IMAGE_FLAG_READING | IMAGE_FLAG_RESERVED)
34
35 struct DRAWRECT
36 {
37   float left;
38   float top;
39   float right;
40   float bottom;
41 };
42
43 enum EFIELDSYNC
44 {
45   FS_NONE,
46   FS_ODD,
47   FS_EVEN
48 };
49
50 struct YUVRANGE
51 {
52   int y_min, y_max;
53   int u_min, u_max;
54   int v_min, v_max;
55 };
56
57 struct YUVCOEF
58 {
59   float r_up, r_vp;
60   float g_up, g_vp;
61   float b_up, b_vp;
62 };
63
64 enum RenderMethod
65 {
66   RENDER_GLSL=0x01,
67   RENDER_SW=0x04,
68   RENDER_POT=0x10
69 };
70
71 enum RenderQuality
72 {
73   RQ_LOW=1,
74   RQ_SINGLEPASS,
75   RQ_MULTIPASS,
76   RQ_SOFTWARE
77 };
78
79 #define PLANE_Y 0
80 #define PLANE_U 1
81 #define PLANE_V 2
82
83 #define FIELD_FULL 0
84 #define FIELD_ODD 1
85 #define FIELD_EVEN 2
86
87 extern YUVRANGE yuv_range_lim;
88 extern YUVRANGE yuv_range_full;
89 extern YUVCOEF yuv_coef_bt601;
90 extern YUVCOEF yuv_coef_bt709;
91 extern YUVCOEF yuv_coef_ebu;
92 extern YUVCOEF yuv_coef_smtp240m;
93
94 class CLinuxRendererGLES : public CBaseRenderer
95 {
96 public:
97   CLinuxRendererGLES();
98   virtual ~CLinuxRendererGLES();
99
100   virtual void Update(bool bPauseDrawing);
101   virtual void SetupScreenshot() {};
102
103   void CreateThumbnail(CBaseTexture *texture, unsigned int width, unsigned int height);
104
105   // Player functions
106   virtual bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags);
107   virtual bool IsConfigured() { return m_bConfigured; }
108   virtual int          GetImage(YV12Image *image, int source = AUTOSOURCE, bool readonly = false);
109   virtual void         ReleaseImage(int source, bool preserve = false);
110   virtual unsigned int DrawSlice(unsigned char *src[], int stride[], int w, int h, int x, int y);
111   virtual void         FlipPage(int source);
112   virtual unsigned int PreInit();
113   virtual void         UnInit();
114   virtual void         Reset(); /* resets renderer after seek for example */
115
116   virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255);
117
118   // Feature support
119   virtual bool SupportsBrightness();
120   virtual bool SupportsContrast();
121   virtual bool SupportsGamma();
122   virtual bool SupportsMultiPassRendering();
123   virtual bool Supports(EINTERLACEMETHOD method);
124   virtual bool Supports(ESCALINGMETHOD method);
125
126 protected:
127   virtual void Render(DWORD flags, int renderBuffer);
128
129   void ChooseUpscalingMethod();
130   bool IsSoftwareUpscaling();
131   void InitializeSoftwareUpscaling();
132
133   virtual void ManageTextures();
134   void DeleteYV12Texture(int index);
135   void ClearYV12Texture(int index);
136   virtual bool CreateYV12Texture(int index, bool clear=true);
137   void CopyYV12Texture(int dest);
138   int  NextYV12Texture();
139   virtual bool ValidateRenderTarget();
140   virtual void LoadShaders(int field=FIELD_FULL);
141   void LoadTextures(int source);
142   void SetTextureFilter(GLenum method);
143   void UpdateVideoFilter();
144
145   // renderers
146   void RenderMultiPass(int renderBuffer, int field);  // multi pass glsl renderer
147   void RenderSinglePass(int renderBuffer, int field); // single pass glsl renderer
148   void RenderSoftware(int renderBuffer, int field);   // single pass s/w yuv2rgb renderer
149
150   CFrameBufferObject m_fbo;
151
152   int m_iYV12RenderBuffer;
153   int m_NumYV12Buffers;
154   int m_iLastRenderBuffer;
155
156   bool m_bConfigured;
157   bool m_bValidated;
158   bool m_bImageReady;
159   unsigned m_iFlags;
160   unsigned short m_renderMethod;
161   RenderQuality m_renderQuality;
162   unsigned int m_flipindex; // just a counter to keep track of if a image has been uploaded
163   bool m_StrictBinding;
164
165   // Software upscaling.
166   int m_upscalingWidth;
167   int m_upscalingHeight;
168   YV12Image m_imScaled;
169   bool m_isSoftwareUpscaling;
170
171   // Raw data used by renderer
172   int m_currentField;
173   int m_reloadShaders;
174
175   struct YUVPLANE
176   {
177     GLuint id;
178     CRect  rect;
179
180     float  width;
181     float  height;
182
183     unsigned texwidth;
184     unsigned texheight;
185
186     unsigned flipindex;
187   };
188
189   typedef YUVPLANE           YUVPLANES[MAX_PLANES];
190   typedef YUVPLANES          YUVFIELDS[MAX_FIELDS];
191
192   struct YUVBUFFER
193   {
194     YUVFIELDS fields;
195     YV12Image image;
196     unsigned  flipindex; /* used to decide if this has been uploaded */
197   };
198
199   typedef YUVBUFFER          YUVBUFFERS[NUM_BUFFERS];
200
201   // YV12 decoder textures
202   // field index 0 is full image, 1 is odd scanlines, 2 is even scanlines
203   YUVBUFFERS m_buffers;
204
205   void LoadPlane( YUVPLANE& plane, int type, unsigned flipindex
206                 , unsigned width,  unsigned height
207                 , int stride, void* data );
208
209   Shaders::BaseYUV2RGBShader     *m_pYUVShader;
210   Shaders::BaseVideoFilterShader *m_pVideoFilterShader;
211   ESCALINGMETHOD m_scalingMethod;
212   ESCALINGMETHOD m_scalingMethodGui;
213
214   // clear colour for "black" bars
215   float m_clearColour;
216
217   // software scale libraries (fallback if required gl version is not available)
218   DllAvUtil    m_dllAvUtil;
219   DllAvCodec   m_dllAvCodec;
220   DllSwScale   m_dllSwScale;
221   BYTE        *m_rgbBuffer;  // if software scale is used, this will hold the result image
222   unsigned int m_rgbBufferSize;
223
224   HANDLE m_eventTexturesDone[NUM_BUFFERS];
225
226 };
227
228
229 inline int NP2( unsigned x )
230 {
231     --x;
232     x |= x >> 1;
233     x |= x >> 2;
234     x |= x >> 4;
235     x |= x >> 8;
236     x |= x >> 16;
237     return ++x;
238 }
239 #endif
240
241 #endif