/**
**
** Copyright 2010, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
#ifndef _PIXELFLINGER2_INTERFACE_H_
#define _PIXELFLINGER2_INTERFACE_H_
#include "GLES2/gl2.h"
#include "pixelflinger2/pixelflinger2_format.h"
#include "pixelflinger2/pixelflinger2_constants.h"
#include "pixelflinger2/pixelflinger2_vector4.h"
typedef struct gl_shader gl_shader_t;
typedef struct gl_shader_program gl_shader_program_t;
typedef struct VertexInput {
Vector4 attributes[GGL_MAXVERTEXATTRIBS]; // vert input
}
#ifndef __arm__
__attribute__ ((aligned (16))) // LLVM generates movaps on X86, needs 16 bytes align
#endif
VertexInput_t;
// the layout must NOT change, and must match the #defines in constants.h
typedef struct VertexOutput {
Vector4 pointSize; // vert output
Vector4 position; // vert output and frag input gl_FragCoord
Vector4 varyings[GGL_MAXVARYINGVECTORS];
Vector4 frontFacingPointCoord; // frag input, gl_FrontFacing gl_PointCoord yzw
Vector4 fragColor[GGL_MAXDRAWBUFFERS]; // frag output, gl_FragData
}
#ifndef __arm__
__attribute__ ((aligned (16)))
#endif
VertexOutput_t ;
typedef struct GGLSurface {
unsigned width, height;
enum GGLPixelFormat format;
void * data;
unsigned stride, version;
} GGLSurface_t;
typedef struct GGLTexture {
unsigned type; // GL_TEXTURE_2D, or GL_TEXTURE_CUBE_MAP
// currently only support RGBA_8888, RGBX_8888 and RGB_565
// storage uses either int or short
enum GGLPixelFormat format; // affects vs/fs jit
unsigned width, height; // base level dimension
unsigned levelCount; // mipmapped texture requires power-of-2 width and height
// data layout is level 0 of first surface (cubemap +x), level 0 of second surface (for cube map, -x),
// level 0 of 3rd surface (cubemap +y), cubemap level 0 -y, cubemap level 0 +z,
// cubemap level 0 -z, level 1 of first surface,
// then level 1 of 1st surface, level 1 of 2nd surface ....
void * levels;
// the following affects vs/fs jit; must fit in byte; size used in GetShaderKey
enum GGLTextureWrap {
GGL_REPEAT = 0, GGL_CLAMP_TO_EDGE = 1, GGL_MIRRORED_REPEAT = 2
} wrapS :
2, wrapT :
2;
enum GGLTextureMinFilter {
GGL_NEAREST = 0, GGL_LINEAR, /*GGL_NEAREST_MIPMAP_NEAREST = 2,
GGL_LINEAR_MIPMAP_NEAREST, GGL_NEAREST_MIPMAP_LINEAR, GGL_LINEAR_MIPMAP_LINEAR = 5*/
} minFilter :
1, magFilter :
1; // only GGL_NEAREST and GGL_LINEAR
} GGLTexture_t;
typedef struct GGLStencilState {
unsigned char ref, mask; // ref is masked during StencilFuncSeparate
// GL_NEVER = 0, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL,
// GL_ALWAYS; value = GLenum & 0x7 (GLenum is 0x200-0x207)
unsigned char func; // compare function
// GL_ZERO = 0, GL_KEEP = 1, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT, GL_INCR_WRAP,
// GL_DECR_WRAP = 7; value = 0 | GLenum - GL_KEEP | GL_INVERT | GLenum - GL_INCR_WRAP
unsigned char sFail, dFail, dPass; // operations
} GGLStencilState_t;
typedef struct GGLActiveStencil { // do not change layout, used in GenerateScanLine
unsigned char face; // FRONT = 0, BACK = 1
unsigned char ref, mask;
} GGLActiveStencil_t;
typedef struct GGLBufferState { // all affect scanline jit
enum GGLPixelFormat colorFormat, depthFormat, stencilFormat;
unsigned stencilTest :
1;
unsigned depthTest :
1;
// same as sf/bFunc; GL_NEVER = 0, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL,
// GL_GEQUAL, GL_ALWAYS = 7; value = GLenum & 0x7 (GLenum is 0x200-0x207)
unsigned depthFunc :
3;
} GGLBufferState_t;
typedef struct GGLBlendState { // all values affect scanline jit
unsigned char color[4]; // rgba[0,255]
// value = 0,1 | GLenum - GL_SRC_COLOR + 2 | GLenum - GL_CONSTANT_COLOR + 11
enum GGLBlendFactor {
GGL_ZERO = 0, GGL_ONE, GGL_SRC_COLOR = 2, GGL_ONE_MINUS_SRC_COLOR, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA,
GGL_DST_ALPHA, GGL_ONE_MINUS_DST_ALPHA, GGL_DST_COLOR, GGL_ONE_MINUS_DST_COLOR,
GGL_SRC_ALPHA_SATURATE, GGL_CONSTANT_COLOR = 11, GGL_ONE_MINUS_CONSTANT_COLOR,
GGL_CONSTANT_ALPHA, GGL_ONE_MINUS_CONSTANT_ALPHA
} scf :
4, saf :
4, dcf :
4, daf :
4;
//value = GLenum - GL_FUNC_ADD
enum GGLBlendFunc {
GGL_FUNC_ADD = 0, GGL_FUNC_SUBTRACT = 4,
GGL_FUNC_REVERSE_SUBTRACT = 5
} ce :
3, ae :
3;
unsigned enable :
1;
} GGLBlendState_t;
typedef struct GGLTextureState {
// format affects vs and fs jit
GGLTexture_t textures[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]; // the active samplers
// array of pointers to texture surface data synced to textures; used by LLVM generated texture sampler
void * textureData[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS];
// array of texture dimensions synced to textures; by LLVM generated texture sampler
unsigned textureDimensions[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS * 2];
} GGLTextureState_t;
typedef struct GGLState {
GGLStencilState_t frontStencil, backStencil; // all affect scanline jit
GGLBufferState_t bufferState; // all affect scanline jit
GGLBlendState_t blendState; // all affect scanline jit
GGLTextureState_t textureState; // most affect vs/fs jit
} GGLState_t;
// most functions are according to GL ES 2.0 spec and uses GLenum values
// there is some error checking for invalid GLenum
typedef struct GGLInterface GGLInterface_t;
struct GGLInterface {
// these 5 should be moved into libAgl2
void (* CullFace)(GGLInterface_t * iface, GLenum mode);
void (* FrontFace)(GGLInterface_t * iface, GLenum mode);
void (* DepthRangef)(GGLInterface_t * iface, GLclampf zNear, GLclampf zFar);
void (* Viewport)(GGLInterface_t * iface, GLint x, GLint y, GLsizei width, GLsizei height);
void (* ViewportTransform)(const GGLInterface_t * iface, Vector4 * v);
void (* BlendColor)(GGLInterface_t * iface, GLclampf red, GLclampf green,
GLclampf blue, GLclampf alpha);
void (* BlendEquationSeparate)(GGLInterface_t * iface, GLenum modeRGB, GLenum modeAlpha);
void (* BlendFuncSeparate)(GGLInterface_t * iface, GLenum srcRGB, GLenum dstRGB,
GLenum srcAlpha, GLenum dstAlpha);
void (* EnableDisable)(GGLInterface_t * iface, GLenum cap, GLboolean enable);
void (* DepthFunc)(GGLInterface_t * iface, GLenum func);
void (* StencilFuncSeparate)(GGLInterface_t * iface, GLenum face, GLenum func,
GLint ref, GLuint mask);
void (* StencilOpSeparate)(GGLInterface_t * iface, GLenum face, GLenum sfail,
GLenum dpfail, GLenum dppass);
// select GL_FRONT or GL_BACK stencil state before raster/scanline
void (* StencilSelect)(const GGLInterface_t * iface, GLenum face);
void (* ClearStencil)(GGLInterface_t * iface, GLint s);
void (* ClearColor)(GGLInterface_t * iface, GLclampf r, GLclampf g, GLclampf b, GLclampf a);
void (* ClearDepthf)(GGLInterface_t * iface, GLclampf d);
void (* Clear)(const GGLInterface_t * iface, GLbitfield buf);
// shallow copy, surface data pointed to must be valid until texture is set to another texture
// libAgl2 needs to check ret of ShaderUniform to detect assigning to sampler unit
void (* SetSampler)(GGLInterface_t * iface, const unsigned sampler, GGLTexture_t * texture);
// shallow copy, surface data must remain valid; use GL_COLOR_BUFFER_BIT,
// GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT; format must be RGBA_8888, Z_32 or S_8
void (* SetBuffer)(GGLInterface_t * iface, const GLenum type, GGLSurface_t * surface);
// runs active vertex shader using currently set program; no error checking
void (* ProcessVertex)(const GGLInterface_t * iface, const VertexInput_t * input,
VertexOutput_t * output);
// draws a triangle given 3 unprocessed vertices; should be moved into libAgl2
void (* DrawTriangle)(const GGLInterface_t * iface, const VertexInput_t * v0,
const VertexInput_t * v1, const VertexInput_t * v2);
// rasters a vertex processed triangle using active program; scizors to frame surface
void (* RasterTriangle)(const GGLInterface_t * iface, const VertexOutput_t * v1,
const VertexOutput_t * v2, const VertexOutput_t * v3);
// rasters a vertex processed trapezoid using active program; scizors to frame surface
void (* RasterTrapezoid)(const GGLInterface_t * iface, const VertexOutput_t * tl,
const VertexOutput_t * tr, const VertexOutput_t * bl,
const VertexOutput_t * br);
// scan line given left and right processed and scizored vertices
void (* ScanLine)(const GGLInterface_t * iface, const VertexOutput_t * v1,
const VertexOutput_t * v2);
// creates empty shader
gl_shader_t * (* ShaderCreate)(const GGLInterface_t * iface, GLenum type);
void (* ShaderSource)(gl_shader_t * shader, GLsizei count, const char ** string, const int * length);
// compiles a shader given glsl; returns GL_TRUE on success; glsl only used during call
GLboolean (* ShaderCompile)(const GGLInterface_t * iface, gl_shader_t * shader,
const char * glsl, const char ** infoLog);
void (* ShaderDelete)(const GGLInterface_t * iface, gl_shader_t * shader);
// creates empty program
gl_shader_program_t * (* ShaderProgramCreate)(const GGLInterface_t * iface);
// attaches a shader to program
void (* ShaderAttach)(const GGLInterface_t * iface, gl_shader_program_t * program,
gl_shader_t * shader);
// detaches a shader from program
void (* ShaderDetach)(const GGLInterface_t * iface, gl_shader_program_t * program,
gl_shader_t * shader);
// duplicates shaders to program, and links varyings / attributes
GLboolean (* ShaderProgramLink)(gl_shader_program_t * program, const char ** infoLog);
// frees program
void (* ShaderProgramDelete)(GGLInterface_t * iface, gl_shader_program_t * program);
// LLVM JIT and set as active program
void (* ShaderUse)(GGLInterface_t * iface, gl_shader_program_t * program);
void (* ShaderGetiv)(const gl_shader_t * shader, const GLenum pname, GLint * params);
void (* ShaderGetInfoLog)(const gl_shader_t * shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
void (* ShaderProgramGetiv)(const gl_shader_program_t * program, const GLenum pname, GLint * params);
void (* ShaderProgramGetInfoLog)(const gl_shader_program_t * program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
// bind attribute location before linking
void (* ShaderAttributeBind)(const gl_shader_program_t * program,
GLuint index, const GLchar * name);
GLint (* ShaderAttributeLocation)(const gl_shader_program_t * program,
const char * name);
// returns fragment input location and vertex output location for varying of linked program
GLint (* ShaderVaryingLocation)(const gl_shader_program_t * program,
const char * name, GLint * vertexOutputLocation);
// gets uniform location for linked program
GLint (* ShaderUniformLocation)(const gl_shader_program_t * program,
const char * name);
void (* ShaderUniformGetfv)(gl_shader_program_t * program,
GLint location, GLfloat * params);
void (* ShaderUniformGetiv)(gl_shader_program_t * program,
GLint location, GLint * params);
// retrieves the tmu each sampler is set to, sampler2tmu[sampler] == -1 means not used
void (* ShaderUniformGetSamplers)(const gl_shader_program_t * program,
int sampler2tmu[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]);
// updates linked program uniform value by location; return >= 0 indicates sampler assigned
GLint (* ShaderUniform)(gl_shader_program_t * program,
GLint location, GLsizei count, const GLvoid *values, GLenum type);
// updates linked program uniform matrix value by location
void (* ShaderUniformMatrix)(gl_shader_program_t * program, GLint cols,
GLint rows, GLint location, GLsizei count,
GLboolean transpose, const GLfloat *values);
};
#ifdef __cplusplus
extern "C"
{
#endif
GGLInterface_t * CreateGGLInterface();
void DestroyGGLInterface(GGLInterface_t * interface);
// creates empty shader
gl_shader_t * GGLShaderCreate(GLenum type);
// compiles a shader given glsl; returns GL_TRUE on success; glsl only used during call; use infoLog to retrieve status
GLboolean GGLShaderCompile(gl_shader_t * shader, const char * glsl, const char ** infoLog);
void GGLShaderDelete(gl_shader_t * shader);
// creates empty program
gl_shader_program_t * GGLShaderProgramCreate();
// attaches a shader to program
unsigned GGLShaderAttach(gl_shader_program_t * program, gl_shader_t * shader);
// detaches a shader from program
unsigned GGLShaderDetach(gl_shader_program_t * program, gl_shader_t * shader);
// duplicates shaders to program, and links varyings / attributes;
GLboolean GGLShaderProgramLink(gl_shader_program_t * program, const char ** infoLog);
// frees program
void GGLShaderProgramDelete(gl_shader_program_t * program);
// LLVM JIT and set as active program, also call after gglState change to re-JIT
void GGLShaderUse(void * llvmCtx, const GGLState_t * gglState, gl_shader_program_t * program);
void GGLShaderGetiv(const gl_shader_t * shader, const GLenum pname, GLint * params);
void GGLShaderGetInfoLog(const gl_shader_t * shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
void GGLShaderProgramGetiv(const gl_shader_program_t * program, const GLenum pname, GLint * params);
void GGLShaderProgramGetInfoLog(const gl_shader_program_t * program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
// bind attribute location before linking
void GGLShaderAttributeBind(const gl_shader_program_t * program,
GLuint index, const GLchar * name);
GLint GGLShaderAttributeLocation(const gl_shader_program_t * program,
const char * name);
// returns fragment input location and vertex output location for varying of linked program
GLint GGLShaderVaryingLocation(const gl_shader_program_t * program,
const char * name, GLint * vertexOutputLocation);
// gets uniform location for linked program
GLint GGLShaderUniformLocation(const gl_shader_program_t * program,
const char * name);
void GGLShaderUniformMatrix(gl_shader_program_t * program, GLint cols, GLint rows,
GLint location, GLsizei count, GLboolean transpose, const GLfloat *values);
// retrieves the tmu each sampler is set to, sampler2tmu[sampler] == -1 means not used
void GGLShaderUniformGetSamplers(const gl_shader_program_t * program,
int sampler2tmu[GGL_MAXCOMBINEDTEXTUREIMAGEUNITS]);
void GGLProcessVertex(const gl_shader_program_t * program, const VertexInput_t * input,
VertexOutput_t * output, const float (*constants)[4]);
// scan line given left and right processed and scizored vertices
// depth value bitcast float->int, if negative then ^= 0x7fffffff
void GGLScanLine(const gl_shader_program_t * program, const enum GGLPixelFormat colorFormat,
void * frameBuffer, int * depthBuffer, unsigned char * stencilBuffer,
unsigned bufferWidth, unsigned bufferHeight, GGLActiveStencil_t * activeStencil,
const VertexOutput_t * start, const VertexOutput_t * end, const float (*constants)[4]);
// void GGLProcessFragment(const VertexOutput_t * inputs, VertexOutput_t * outputs,
// const float (*constants[4]));
#ifdef __cplusplus
}
#endif
#endif // #ifndef _PIXELFLINGER2_INTERFACE_H_