1/**
2 **
3 ** Copyright 2010, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18#ifndef _PIXELFLINGER2_INTERFACE_H_
19#define _PIXELFLINGER2_INTERFACE_H_
20
21#include "GLES2/gl2.h"
22#include "pixelflinger2/pixelflinger2_format.h"
23#include "pixelflinger2/pixelflinger2_constants.h"
24#include "pixelflinger2/pixelflinger2_vector4.h"
25
26typedef struct gl_shader gl_shader_t;
27typedef struct gl_shader_program gl_shader_program_t;
28
29typedef struct VertexInput {
30   Vector4 attributes[GGL_MAXVERTEXATTRIBS]; // vert input
31}
32#ifndef __arm__
33__attribute__ ((aligned (16))) // LLVM generates movaps on X86, needs 16 bytes align
34#endif
35VertexInput_t;
36
37// the layout must NOT change, and must match the #defines in constants.h
38typedef struct VertexOutput {
39   Vector4 pointSize; // vert output
40   Vector4 position; // vert output and frag input gl_FragCoord
41   Vector4 varyings[GGL_MAXVARYINGVECTORS];
42   Vector4 frontFacingPointCoord; // frag input, gl_FrontFacing gl_PointCoord yzw
43   Vector4 fragColor[GGL_MAXDRAWBUFFERS]; // frag output, gl_FragData
44}
45#ifndef __arm__
46__attribute__ ((aligned (16)))
47#endif
48VertexOutput_t ;
49
50typedef struct GGLSurface {
51   unsigned width, height;
52   enum GGLPixelFormat format;
53   void * data;
54   unsigned stride, version;
55} GGLSurface_t;
56
57typedef struct GGLTexture {
58   unsigned type; // GL_TEXTURE_2D, or GL_TEXTURE_CUBE_MAP
59
60   // currently only support RGBA_8888, RGBX_8888 and RGB_565
61   // storage uses either int or short
62   enum GGLPixelFormat format; // affects vs/fs jit
63
64   unsigned width, height; // base level dimension
65   unsigned levelCount; // mipmapped texture requires power-of-2 width and height
66
67   // data layout is level 0 of first surface (cubemap +x), level 0 of second surface (for cube map, -x),
68   // level 0 of 3rd surface (cubemap +y), cubemap level 0 -y, cubemap level 0 +z,
69   // cubemap level 0 -z, level 1 of first surface,
70   // then level 1 of 1st surface, level 1 of 2nd surface ....
71   void * levels;
72
73   // the following affects vs/fs jit; must fit in byte; size used in GetShaderKey
74   enum GGLTextureWrap {
75      GGL_REPEAT = 0, GGL_CLAMP_TO_EDGE = 1, GGL_MIRRORED_REPEAT = 2
76} wrapS :
772, wrapT :
78   2;
79
80   enum GGLTextureMinFilter {
81      GGL_NEAREST = 0, GGL_LINEAR, /*GGL_NEAREST_MIPMAP_NEAREST = 2,
82      GGL_LINEAR_MIPMAP_NEAREST, GGL_NEAREST_MIPMAP_LINEAR, GGL_LINEAR_MIPMAP_LINEAR = 5*/
83} minFilter :
841, magFilter :
85   1; // only GGL_NEAREST and GGL_LINEAR
86} GGLTexture_t;
87
88typedef struct GGLStencilState {
89   unsigned char ref, mask; // ref is masked during StencilFuncSeparate
90
91   // GL_NEVER = 0, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL,
92   // GL_ALWAYS; value = GLenum  & 0x7 (GLenum is 0x200-0x207)
93   unsigned char func; // compare function
94
95   // GL_ZERO = 0, GL_KEEP = 1, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP,
96   // GL_DECR_WRAP = 7; value = 0 | GLenum - GL_KEEP | GL_INVERT | GLenum - GL_INCR_WRAP
97   unsigned char sFail, dFail, dPass; // operations
98}  GGLStencilState_t;
99
100typedef struct GGLActiveStencil { // do not change layout, used in GenerateScanLine
101   unsigned char face; // FRONT = 0, BACK = 1
102   unsigned char ref, mask;
103} GGLActiveStencil_t;
104
105typedef struct GGLBufferState { // all affect scanline jit
106   enum GGLPixelFormat colorFormat, depthFormat, stencilFormat;
107unsigned stencilTest :
108   1;
109unsigned depthTest :
110   1;
111   // same as sf/bFunc; GL_NEVER = 0, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL,
112   // GL_GEQUAL, GL_ALWAYS = 7; value = GLenum  & 0x7 (GLenum is 0x200-0x207)
113unsigned depthFunc :
114   3;
115} GGLBufferState_t;
116
117typedef struct GGLBlendState { // all values affect scanline jit
118   unsigned char color[4]; // rgba[0,255]
119
120   // value = 0,1 | GLenum - GL_SRC_COLOR + 2 | GLenum - GL_CONSTANT_COLOR + 11
121   enum GGLBlendFactor {
122      GGL_ZERO = 0, GGL_ONE, GGL_SRC_COLOR = 2, GGL_ONE_MINUS_SRC_COLOR, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA,
123      GGL_DST_ALPHA, GGL_ONE_MINUS_DST_ALPHA, GGL_DST_COLOR, GGL_ONE_MINUS_DST_COLOR,
124      GGL_SRC_ALPHA_SATURATE, GGL_CONSTANT_COLOR = 11, GGL_ONE_MINUS_CONSTANT_COLOR,
125      GGL_CONSTANT_ALPHA, GGL_ONE_MINUS_CONSTANT_ALPHA
126} scf :
1274, saf :
1284, dcf :
1294, daf :
130   4;
131
132   //value = GLenum - GL_FUNC_ADD
133   enum GGLBlendFunc {
134      GGL_FUNC_ADD = 0, GGL_FUNC_SUBTRACT = 4,
135      GGL_FUNC_REVERSE_SUBTRACT = 5
136} ce :
1373, ae :
138   3;
139
140unsigned enable :
141   1;
142} GGLBlendState_t;
143
144typedef struct GGLTextureState {
145   // format affects vs and fs jit
146   GGLTexture_t textures[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]; // the active samplers
147   // array of pointers to texture surface data synced to textures; used by LLVM generated texture sampler
148   void * textureData[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS];
149   // array of texture dimensions synced to textures; by LLVM generated texture sampler
150   unsigned textureDimensions[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS * 2];
151} GGLTextureState_t;
152
153typedef struct GGLState {
154   GGLStencilState_t frontStencil, backStencil; // all affect scanline jit
155
156   GGLBufferState_t bufferState; // all affect scanline jit
157
158   GGLBlendState_t blendState; // all affect scanline jit
159
160   GGLTextureState_t textureState; // most affect vs/fs jit
161
162} GGLState_t;
163
164// most functions are according to GL ES 2.0 spec and uses GLenum values
165// there is some error checking for invalid GLenum
166typedef struct GGLInterface GGLInterface_t;
167struct GGLInterface {
168   // these 5 should be moved into libAgl2
169   void (* CullFace)(GGLInterface_t * iface, GLenum mode);
170   void (* FrontFace)(GGLInterface_t * iface, GLenum mode);
171   void (* DepthRangef)(GGLInterface_t * iface, GLclampf zNear, GLclampf zFar);
172   void (* Viewport)(GGLInterface_t * iface, GLint x, GLint y, GLsizei width, GLsizei height);
173   void (* ViewportTransform)(const GGLInterface_t * iface, Vector4 * v);
174
175
176   void (* BlendColor)(GGLInterface_t * iface, GLclampf red, GLclampf green,
177                       GLclampf blue, GLclampf alpha);
178   void (* BlendEquationSeparate)(GGLInterface_t * iface, GLenum modeRGB, GLenum modeAlpha);
179   void (* BlendFuncSeparate)(GGLInterface_t * iface, GLenum srcRGB, GLenum dstRGB,
180                              GLenum srcAlpha, GLenum dstAlpha);
181   void (* EnableDisable)(GGLInterface_t * iface, GLenum cap, GLboolean enable);
182
183   void (* DepthFunc)(GGLInterface_t * iface, GLenum func);
184   void (* StencilFuncSeparate)(GGLInterface_t * iface, GLenum face, GLenum func,
185                                GLint ref, GLuint mask);
186   void (* StencilOpSeparate)(GGLInterface_t * iface, GLenum face, GLenum sfail,
187                              GLenum dpfail, GLenum dppass);
188   // select GL_FRONT or GL_BACK stencil state before raster/scanline
189   void (* StencilSelect)(const GGLInterface_t * iface, GLenum face);
190   void (* ClearStencil)(GGLInterface_t * iface, GLint s);
191   void (* ClearColor)(GGLInterface_t * iface, GLclampf r, GLclampf g, GLclampf b, GLclampf a);
192   void (* ClearDepthf)(GGLInterface_t * iface, GLclampf d);
193   void (* Clear)(const GGLInterface_t * iface, GLbitfield buf);
194
195   // shallow copy, surface data pointed to must be valid until texture is set to another texture
196   // libAgl2 needs to check ret of ShaderUniform to detect assigning to sampler unit
197   void (* SetSampler)(GGLInterface_t * iface, const unsigned sampler, GGLTexture_t * texture);
198
199   // shallow copy, surface data must remain valid; use GL_COLOR_BUFFER_BIT,
200   // GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT; format must be RGBA_8888, Z_32 or S_8
201   void (* SetBuffer)(GGLInterface_t * iface, const GLenum type, GGLSurface_t * surface);
202
203
204   // runs active vertex shader using currently set program; no error checking
205   void (* ProcessVertex)(const GGLInterface_t * iface, const VertexInput_t * input,
206                          VertexOutput_t * output);
207   // draws a triangle given 3 unprocessed vertices; should be moved into libAgl2
208   void (* DrawTriangle)(const GGLInterface_t * iface, const VertexInput_t * v0,
209                         const VertexInput_t * v1, const VertexInput_t * v2);
210   // rasters a vertex processed triangle using active program; scizors to frame surface
211   void (* RasterTriangle)(const GGLInterface_t * iface, const VertexOutput_t * v1,
212                           const VertexOutput_t * v2, const VertexOutput_t * v3);
213   // rasters a vertex processed trapezoid using active program; scizors to frame surface
214   void (* RasterTrapezoid)(const GGLInterface_t * iface, const VertexOutput_t * tl,
215                            const VertexOutput_t * tr, const VertexOutput_t * bl,
216                            const VertexOutput_t * br);
217
218   // scan line given left and right processed and scizored vertices
219   void (* ScanLine)(const GGLInterface_t * iface, const VertexOutput_t * v1,
220                     const VertexOutput_t * v2);
221
222   // creates empty shader
223   gl_shader_t * (* ShaderCreate)(const GGLInterface_t * iface, GLenum type);
224
225   void (* ShaderSource)(gl_shader_t * shader, GLsizei count, const char ** string, const int * length);
226
227   // compiles a shader given glsl; returns GL_TRUE on success; glsl only used during call
228   GLboolean (* ShaderCompile)(const GGLInterface_t * iface, gl_shader_t * shader,
229                               const char * glsl, const char ** infoLog);
230
231   void (* ShaderDelete)(const GGLInterface_t * iface, gl_shader_t * shader);
232
233   // creates empty program
234   gl_shader_program_t * (* ShaderProgramCreate)(const GGLInterface_t * iface);
235
236   // attaches a shader to program
237   void (* ShaderAttach)(const GGLInterface_t * iface, gl_shader_program_t * program,
238                         gl_shader_t * shader);
239
240   // detaches a shader from program
241   void (* ShaderDetach)(const GGLInterface_t * iface, gl_shader_program_t * program,
242                         gl_shader_t * shader);
243
244   // duplicates shaders to program, and links varyings / attributes
245   GLboolean (* ShaderProgramLink)(gl_shader_program_t * program, const char ** infoLog);
246   // frees program
247   void (* ShaderProgramDelete)(GGLInterface_t * iface, gl_shader_program_t * program);
248
249   // LLVM JIT and set as active program
250   void (* ShaderUse)(GGLInterface_t * iface, gl_shader_program_t * program);
251
252   void (* ShaderGetiv)(const gl_shader_t * shader, const GLenum pname, GLint * params);
253
254   void (* ShaderGetInfoLog)(const gl_shader_t * shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
255
256   void (* ShaderProgramGetiv)(const gl_shader_program_t * program, const GLenum pname, GLint * params);
257
258   void (* ShaderProgramGetInfoLog)(const gl_shader_program_t * program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
259
260   // bind attribute location before linking
261   void (* ShaderAttributeBind)(const gl_shader_program_t * program,
262                                GLuint index, const GLchar * name);
263   GLint (* ShaderAttributeLocation)(const gl_shader_program_t * program,
264                                     const char * name);
265   // returns fragment input location and vertex output location for varying of linked program
266   GLint (* ShaderVaryingLocation)(const gl_shader_program_t * program,
267                                   const char * name, GLint * vertexOutputLocation);
268   // gets uniform location for linked program
269   GLint (* ShaderUniformLocation)(const gl_shader_program_t * program,
270                                   const char * name);
271   void (* ShaderUniformGetfv)(gl_shader_program_t * program,
272                               GLint location, GLfloat * params);
273   void (* ShaderUniformGetiv)(gl_shader_program_t * program,
274                               GLint location, GLint * params);
275
276   // retrieves the tmu each sampler is set to, sampler2tmu[sampler] == -1 means not used
277   void (* ShaderUniformGetSamplers)(const gl_shader_program_t * program,
278                                     int sampler2tmu[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]);
279
280   // updates linked program uniform value by location; return >= 0 indicates sampler assigned
281   GLint (* ShaderUniform)(gl_shader_program_t * program,
282                           GLint location, GLsizei count, const GLvoid *values, GLenum type);
283
284   // updates linked program uniform matrix value by location
285   void (* ShaderUniformMatrix)(gl_shader_program_t * program, GLint cols,
286                                GLint rows, GLint location, GLsizei count,
287                                GLboolean transpose, const GLfloat *values);
288};
289
290#ifdef __cplusplus
291extern "C"
292{
293#endif
294
295   GGLInterface_t * CreateGGLInterface();
296
297   void DestroyGGLInterface(GGLInterface_t * interface);
298
299   // creates empty shader
300   gl_shader_t * GGLShaderCreate(GLenum type);
301
302   // compiles a shader given glsl; returns GL_TRUE on success; glsl only used during call; use infoLog to retrieve status
303   GLboolean GGLShaderCompile(gl_shader_t * shader, const char * glsl, const char ** infoLog);
304
305   void GGLShaderDelete(gl_shader_t * shader);
306
307   // creates empty program
308   gl_shader_program_t * GGLShaderProgramCreate();
309
310   // attaches a shader to program
311   unsigned GGLShaderAttach(gl_shader_program_t * program, gl_shader_t * shader);
312
313   // detaches a shader from program
314   unsigned GGLShaderDetach(gl_shader_program_t * program, gl_shader_t * shader);
315
316   // duplicates shaders to program, and links varyings / attributes;
317   GLboolean GGLShaderProgramLink(gl_shader_program_t * program, const char ** infoLog);
318
319   // frees program
320   void GGLShaderProgramDelete(gl_shader_program_t * program);
321
322   // LLVM JIT and set as active program, also call after gglState change to re-JIT
323   void GGLShaderUse(void * llvmCtx, const GGLState_t * gglState, gl_shader_program_t * program);
324
325   void GGLShaderGetiv(const gl_shader_t * shader, const GLenum pname, GLint * params);
326
327   void GGLShaderGetInfoLog(const gl_shader_t * shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
328
329   void GGLShaderProgramGetiv(const gl_shader_program_t * program, const GLenum pname, GLint * params);
330
331   void GGLShaderProgramGetInfoLog(const gl_shader_program_t * program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
332
333   // bind attribute location before linking
334   void GGLShaderAttributeBind(const gl_shader_program_t * program,
335                               GLuint index, const GLchar * name);
336   GLint GGLShaderAttributeLocation(const gl_shader_program_t * program,
337                                    const char * name);
338   // returns fragment input location and vertex output location for varying of linked program
339   GLint GGLShaderVaryingLocation(const gl_shader_program_t * program,
340                                  const char * name, GLint * vertexOutputLocation);
341   // gets uniform location for linked program
342   GLint GGLShaderUniformLocation(const gl_shader_program_t * program,
343                                  const char * name);
344
345   void GGLShaderUniformMatrix(gl_shader_program_t * program, GLint cols, GLint rows,
346                            GLint location, GLsizei count, GLboolean transpose, const GLfloat *values);
347
348   // retrieves the tmu each sampler is set to, sampler2tmu[sampler] == -1 means not used
349   void GGLShaderUniformGetSamplers(const gl_shader_program_t * program,
350                                    int sampler2tmu[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]);
351
352   void GGLProcessVertex(const gl_shader_program_t * program, const VertexInput_t * input,
353                         VertexOutput_t * output, const float (*constants)[4]);
354
355   // scan line given left and right processed and scizored vertices
356   // depth value bitcast float->int, if negative then ^= 0x7fffffff
357   void GGLScanLine(const gl_shader_program_t * program, const enum GGLPixelFormat colorFormat,
358                    void * frameBuffer, int * depthBuffer, unsigned char * stencilBuffer,
359                    unsigned bufferWidth, unsigned bufferHeight, GGLActiveStencil_t * activeStencil,
360                    const VertexOutput_t * start, const VertexOutput_t * end, const float (*constants)[4]);
361
362//   void GGLProcessFragment(const VertexOutput_t * inputs, VertexOutput_t * outputs,
363//                           const float (*constants[4]));
364
365#ifdef __cplusplus
366}
367#endif
368
369#endif // #ifndef _PIXELFLINGER2_INTERFACE_H_
370