Bläddra i källkod

debug: add new shader tests and write some Cg equivalents on the PS3.

legacy
Sam Hocevar sam 13 år sedan
förälder
incheckning
1e9cfba718
1 ändrade filer med 234 tillägg och 71 borttagningar
  1. +234
    -71
      src/debug/quad.cpp

+ 234
- 71
src/debug/quad.cpp Visa fil

@@ -14,6 +14,7 @@

#include <cmath>
#include <cstdio>
#include <cstring>

#include "core.h"
#include "lolgl.h"
@@ -28,11 +29,12 @@ namespace lol
* DebugQuad implementation class
*/

static int const NUM_ARRAYS = 2;
static int const NUM_BUFFERS = 9;
static int const NUM_ATTRS = 6;
static int const NUM_SHADERS = 6;
static int const NUM_TEXTURES = 1;
static int const NUM_ARRAYS = 10;
static int const NUM_BUFFERS = 20;
static int const NUM_ATTRS = 20;
static int const NUM_UNIFORMS = 20;
static int const NUM_SHADERS = 20;
static int const NUM_TEXTURES = 10;

static int const TEX_SIZE = 32;

@@ -51,8 +53,18 @@ private:
GLuint buffer[NUM_BUFFERS];
Shader *shader[NUM_SHADERS];
GLuint attr[NUM_ATTRS];
GLuint uni[NUM_UNIFORMS];
GLuint texture[NUM_TEXTURES];
uint8_t image[1][TEX_SIZE * TEX_SIZE * 4];

GLfloat const *GetVertexArray()
{
GLfloat tmp[18] = { aa.x, bb.y, 0, bb.x, bb.y, 0, bb.x, aa.y, 0,
bb.x, aa.y, 0, aa.x, aa.y, 0, aa.x, bb.y, 0 };
memcpy(vertices, tmp, sizeof(tmp));
return vertices;
}
GLfloat vertices[18]; /* To cache quad coordinates */
};

/*
@@ -125,7 +137,7 @@ void DebugQuad::TickDraw(float deltams)
}

/* Prepare our quad coordinates */
vec2i const layout(4, 3);
vec2i const layout(5, 4);
data->step = vec2(2.0f, -2.0f) / (4 * layout + vec2i(1));
data->orig = vec2(-1.0f, 1.0f) + data->step;
data->aa = data->orig;
@@ -149,15 +161,16 @@ void DebugQuad::TickDraw(float deltams)
GLuint *buffer = data->buffer;
Shader **shader = data->shader;
GLuint *attr = data->attr;
GLuint *uni = data->uni;

ResetState();

#if defined HAVE_GLBEGIN || defined USE_GLEW
/*
* Test #1: simple glBegin code
*
* Renders an orange square.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
glColor3f(0.8f, 0.5f, 0.2f);
glBegin(GL_TRIANGLES);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
@@ -168,6 +181,7 @@ void DebugQuad::TickDraw(float deltams)
glVertex3f(data->aa.x, data->aa.y, 0.0f);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glEnd();
#endif

Advance();
ResetState();
@@ -177,7 +191,7 @@ void DebugQuad::TickDraw(float deltams)
*
* Renders a multicoloured square with varying colors.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
glBegin(GL_TRIANGLES);
glColor3f(f1, f2, f3);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
@@ -192,6 +206,7 @@ void DebugQuad::TickDraw(float deltams)
glColor3f(f1, f2, f3);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glEnd();
#endif

Advance();
ResetState();
@@ -202,6 +217,7 @@ void DebugQuad::TickDraw(float deltams)
* Renders a multicoloured square with varying colors multiplied with an
* animated distorted checkerboard.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, data->texture[0]);
glColor3f(1.0f, 1.0f, 1.0f);
@@ -226,6 +242,7 @@ void DebugQuad::TickDraw(float deltams)
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
#endif

Advance();
ResetState();
@@ -235,6 +252,7 @@ void DebugQuad::TickDraw(float deltams)
*
* Renders a static, coloured and tiled pattern.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
if (!shader[0])
shader[0] = Shader::Create(
"#version 110\n"
@@ -263,7 +281,7 @@ void DebugQuad::TickDraw(float deltams)
glVertex3f(data->aa.x, data->aa.y, 0.0f);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glEnd();
glUseProgram(0);
#endif

Advance();
ResetState();
@@ -274,6 +292,7 @@ void DebugQuad::TickDraw(float deltams)
*
* Renders a multicoloured square with varying colors.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
if (!shader[0])
shader[0] = Shader::Create(
"#version 110\n"
@@ -310,7 +329,7 @@ void DebugQuad::TickDraw(float deltams)
glTexCoord3f(f1, f2, f3);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glEnd();
glUseProgram(0);
#endif

Advance();
ResetState();
@@ -324,6 +343,7 @@ void DebugQuad::TickDraw(float deltams)
* Note: there is no need to glEnable(GL_TEXTURE_2D) when the
* texture lookup is done in a shader.
*/
#if defined HAVE_GLBEGIN || defined USE_GLEW
if (!shader[0])
shader[0] = Shader::Create(
"#version 110\n"
@@ -358,11 +378,10 @@ void DebugQuad::TickDraw(float deltams)
glTexCoord2f(f1, f3);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
glEnd();
glUseProgram(0);
#endif

Advance();
ResetState();
#endif

/*
* Test #7: simple vertex buffer
@@ -370,24 +389,17 @@ void DebugQuad::TickDraw(float deltams)
* Renders an orange square.
*/
#if !defined ANDROID_NDK
GLfloat const vertices1[] = { data->aa.x, data->bb.y, 0.0f,
data->bb.x, data->bb.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glColor4f(0.8f, 0.5f, 0.2f, 1.0f);
glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, vertices1);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glDrawArrays(GL_TRIANGLES, 0, 6);

glDisableClientState(GL_VERTEX_ARRAY);
#endif

Advance();
ResetState();
#endif

/*
* Test #8: vertex buffer + per-vertex coloring
@@ -395,26 +407,19 @@ void DebugQuad::TickDraw(float deltams)
* Renders a multicoloured square with varying colors.
*/
#if !defined ANDROID_NDK
GLfloat const vertices2[] = { data->aa.x, data->bb.y, 0.0f,
data->bb.x, data->bb.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, vertices2);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glColorPointer(3, GL_FLOAT, 0, colors);
glDrawArrays(GL_TRIANGLES, 0, 6);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
#endif

Advance();
ResetState();
#endif

/*
* Test #9: vertex buffer + per-vertex coloring + texture
@@ -423,20 +428,13 @@ void DebugQuad::TickDraw(float deltams)
* animated distorted checkerboard.
*/
#if !defined ANDROID_NDK
GLfloat const vertices3[] = { data->aa.x, data->bb.y, 0.0f,
data->bb.x, data->bb.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, data->texture[0]);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, vertices3);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glColorPointer(3, GL_FLOAT, 0, colors);
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);

@@ -446,19 +444,176 @@ void DebugQuad::TickDraw(float deltams)
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
#endif

Advance();
ResetState();

/*
* Test #10: vertex buffer + hardcoded color in 1.10 fragment shader
* (GLSL) or in Cg fragment shader (PS3)
*
* Renders an orange square.
*/
#if !defined ANDROID_NDK
if (!shader[0])
#if !defined __CELLOS_LV2__
shader[0] = Shader::Create(
"#version 110\n"
"void main()"
"{"
" gl_Position = gl_Vertex;"
"}",

"#version 110\n"
"void main()"
"{"
" gl_FragColor = vec4(0.8, 0.5, 0.2, 1.0);"
"}");
#else
shader[0] = Shader::Create(
"void main(float4 in_Position : POSITION,"
" out float4 out_Position : POSITION)"
"{"
" out_Position = in_Position;"
"}",

"void main(out float4 out_FragColor : COLOR)"
"{"
" out_FragColor = float4(0.8, 0.5, 0.2, 1.0);"
"}");
#endif
shader[0]->Bind();
shader++;

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
#endif

Advance();
ResetState();

/*
* Test #10: vertex buffer + texture & color in 1.10 fragment shader
* Test #11: vertex buffer + uniform color in 1.10 fragment shader
* (GLSL) or in Cg fragment shader (PS3)
*
* Renders an orange square.
*/
#if !defined ANDROID_NDK
if (!shader[0])
{
#if !defined __CELLOS_LV2__
shader[0] = Shader::Create(
"#version 110\n"
"void main()"
"{"
" gl_Position = gl_Vertex;"
"}",

"#version 110\n"
"uniform vec4 in_Color;"
"void main()"
"{"
" gl_FragColor = in_Color;"
"}");
#else
shader[0] = Shader::Create(
"void main(float4 in_Position : POSITION,"
" out float4 out_Position : POSITION)"
"{"
" out_Position = in_Position;"
"}",

"uniform float4 in_Color;"
"void main(out float4 out_FragColor : COLOR)"
"{"
" out_FragColor = in_Color;"
"}");
#endif
uni[0] = shader[0]->GetUniformLocation("in_Color");
}
shader[0]->Bind();
shader++;
#if !defined __CELLOS_LV2__
glUniform4f(uni[0], 0.8f, 0.5f, 0.2f, 1.0f);
#else
cgGLSetParameter4f((CGparameter)(intptr_t)uni[0], 0.8f, 0.5f, 0.2f, 1.0f);
#endif
uni++;

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
#endif

Advance();
ResetState();

/*
* Test #12: vertex buffer + color in 1.10 fragment shader (GLSL) or
* in Cg fragment shader (PS3)
*
* Renders a static, coloured and tiled pattern.
*/
#if !defined ANDROID_NDK
if (!shader[0])
#if !defined __CELLOS_LV2__
shader[0] = Shader::Create(
"#version 110\n"
"void main()"
"{"
" gl_Position = gl_Vertex;"
"}",

"#version 110\n"
"void main()"
"{"
" float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);"
" float dy = mod(gl_FragCoord.x * 0.125, 1.0);"
" float dz = mod(gl_FragCoord.y * 0.125, 1.0);"
" gl_FragColor = vec4(dx, dy, dz, 1.0);"
"}");
#else
shader[0] = Shader::Create(
"void main(float4 in_Position : POSITION,"
" out float4 out_Position : POSITION)"
"{"
" out_Position = in_Position;"
"}",

"void main(float4 in_FragCoord : WPOS,"
" out float4 out_FragColor : COLOR)"
"{"
" float dx = frac(in_FragCoord.x * in_FragCoord.y * 0.5) * 2.0;"
" float dy = frac(in_FragCoord.x * 0.125);"
" float dz = frac(in_FragCoord.y * 0.125);"
" out_FragColor = float4(dx, dy, dz, 1.0);"
"}");
#endif
shader[0]->Bind();
shader++;

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
#endif

Advance();
ResetState();

/*
* Test #13: vertex buffer + texture & color in 1.10 fragment shader
*
* Renders a multicoloured square with varying colors xored with an
* animated distorted checkerboard.
*/
#if !defined __CELLOS_LV2__ && !defined ANDROID_NDK
#if !defined ANDROID_NDK
if (!shader[0])
#if !defined __CELLOS_LV2__
shader[0] = Shader::Create(
"#version 110\n"
"varying vec4 pass_Color;"
@@ -477,15 +632,32 @@ void DebugQuad::TickDraw(float deltams)
" vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);"
" gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);"
"}");
#else
shader[0] = Shader::Create(
"void main(float4 in_Position : POSITION,"
" float2 in_TexCoord : TEXCOORD0,"
" float4 in_Color : COLOR,"
" out float4 out_Color : COLOR,"
" out float4 out_Position : POSITION,"
" out float2 out_TexCoord : TEXCOORD0)"
"{"
" out_TexCoord = in_TexCoord;"
" out_Color = in_Color;"
" out_Position = in_Position;"
"}",

"void main(float2 in_TexCoord : TEXCOORD0,"
" float4 in_Color : COLOR,"
" uniform sampler2D tex,"
" out float4 out_FragColor : COLOR)"
"{"
" float4 tmp = tex2D(tex, in_TexCoord * 0.25);"
" out_FragColor = float4(abs(tmp.xyz - in_Color.xyz), 1);"
"}");
#endif

shader[0]->Bind();
shader++;
GLfloat const vertices4[] = { data->aa.x, data->bb.y, 0.0f,
data->bb.x, data->bb.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glBindTexture(GL_TEXTURE_2D, data->texture[0]);

@@ -493,7 +665,7 @@ void DebugQuad::TickDraw(float deltams)
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, vertices4);
glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray());
glColorPointer(3, GL_FLOAT, 0, colors);
glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
glDrawArrays(GL_TRIANGLES, 0, 6);
@@ -501,14 +673,13 @@ void DebugQuad::TickDraw(float deltams)
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glUseProgram(0);
#endif

Advance();
ResetState();
#endif

/*
* Test #11: vertex buffer + texture & color in 1.20 fragment shader
* Test #14: vertex buffer + texture & color in 1.20 fragment shader
*
* Renders a multicoloured square with varying colors xored with an
* animated distorted checkerboard.
@@ -543,20 +714,14 @@ void DebugQuad::TickDraw(float deltams)
}
shader[0]->Bind();
shader++;
GLfloat const vertices5[] = { data->aa.x, data->bb.y, 0.0f,
data->bb.x, data->bb.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glBindTexture(GL_TEXTURE_2D, data->texture[0]);

glBindVertexArray(*array++);

glBindBuffer(GL_ARRAY_BUFFER, *buffer++);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices5), vertices5,
GL_DYNAMIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, 3 * 6 * sizeof(GLfloat),
data->GetVertexArray(), GL_DYNAMIC_DRAW);
glVertexAttribPointer(attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attr[0]);

@@ -578,14 +743,13 @@ void DebugQuad::TickDraw(float deltams)
glDisableVertexAttribArray(*attr++);
glDisableVertexAttribArray(*attr++);
glDisableVertexAttribArray(*attr++);
glUseProgram(0);
#endif

Advance();
ResetState();
#endif

/*
* Test #12: vertex buffer + texture & color in 1.30 fragment shader
* Test #15: vertex buffer + texture & color in 1.30 fragment shader
*
* Renders a multicoloured square with varying colors xored with an
* animated distorted checkerboard.
@@ -620,20 +784,14 @@ void DebugQuad::TickDraw(float deltams)
}
shader[0]->Bind();
shader++;
GLfloat const vertices6[] = { data->aa.x, data->bb.y, 0.0f,
data->bb.x, data->bb.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->bb.x, data->aa.y, 0.0f,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glBindTexture(GL_TEXTURE_2D, data->texture[0]);

glBindVertexArray(*array++);

glBindBuffer(GL_ARRAY_BUFFER, *buffer++);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices6), vertices6,
GL_DYNAMIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, 3 * 6 * sizeof(GLfloat),
data->GetVertexArray(), GL_DYNAMIC_DRAW);
glVertexAttribPointer(attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attr[0]);

@@ -655,11 +813,10 @@ void DebugQuad::TickDraw(float deltams)
glDisableVertexAttribArray(*attr++);
glDisableVertexAttribArray(*attr++);
glDisableVertexAttribArray(*attr++);
glUseProgram(0);
#endif

Advance();
ResetState();
#endif

/* Check that we didn't overflow our list */
#if !defined __CELLOS_LV2__ && !defined ANDROID_NDK
@@ -677,6 +834,7 @@ void DebugQuad::TickDraw(float deltams)
void DebugQuad::ResetState()
{
/* Reset GL states to something reasonably safe */

#if defined HAVE_GLBEGIN || defined USE_GLEW || defined __CELLOS_LV2__
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
@@ -684,6 +842,8 @@ void DebugQuad::ResetState()
glLoadIdentity();
#endif

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
#if defined HAVE_GLBEGIN || defined USE_GLEW || defined __CELLOS_LV2__
@@ -694,6 +854,9 @@ void DebugQuad::ResetState()
glBindBuffer(GL_ARRAY_BUFFER, 0);
#if !defined __CELLOS_LV2__
glUseProgram(0);
#else
cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_VERTEX));
cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_FRAGMENT));
#endif
}



Laddar…
Avbryt
Spara