GL3: Use HMM types in structs for UBOs, some cleanups

.. hmm_mat4 and hmm_vec4 are much easier to set than float arrays.

removed some debug code from initShader2D()
This commit is contained in:
Daniel Gibson 2017-02-19 03:01:33 +01:00
parent 101b9b14bb
commit 7cd86106dc
5 changed files with 36 additions and 71 deletions

View file

@ -257,7 +257,6 @@ GL3_Draw_Fill(int x, int y, int w, int h, int c)
byte v[4];
} color;
int i;
float cf[3];
if ((unsigned)c > 255)
{
@ -276,8 +275,9 @@ GL3_Draw_Fill(int x, int y, int w, int h, int c)
for(i=0; i<3; ++i)
{
gl3state.uniCommonData.color[i] = color.v[i] * (1.0f/255.0f);
gl3state.uniCommonData.color.Elements[i] = color.v[i] * (1.0f/255.0f);
}
gl3state.uniCommonData.color.A = 1.0f;
GL3_UpdateUBOCommon();
@ -295,7 +295,6 @@ GL3_Draw_FadeScreen(void)
{
float w = vid.width;
float h = vid.height;
int i=0;
GLfloat vBuf[8] = {
// X, Y
@ -307,15 +306,9 @@ GL3_Draw_FadeScreen(void)
glEnable(GL_BLEND);
for(i=0; i<3; ++i)
{
gl3state.uniCommonData.color[i] = 0.0f;
}
gl3state.uniCommonData.color[3] = 0.6f;
gl3state.uniCommonData.color = HMM_Vec4(0, 0, 0, 0.6f);
GL3_UpdateUBOCommon();
GL3_UseProgram(gl3state.si2Dcolor.shaderProgram);
GL3_BindVAO(vao2Dcolor);
@ -323,11 +316,6 @@ GL3_Draw_FadeScreen(void)
glBindBuffer(GL_ARRAY_BUFFER, vbo2D);
glBufferData(GL_ARRAY_BUFFER, sizeof(vBuf), vBuf, GL_STREAM_DRAW);
//glEnableVertexAttribArray(gl3state.si2Dcolor.attribPosition);
//qglVertexAttribPointer(gl3state.si2Dcolor.attribPosition, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), 0);
//glEnableVertexAttribArray(gl3state.si2Dcolor.attribColor);
//qglVertexAttribPointer(gl3state.si2Dcolor.attribColor, 2, GL_FLOAT, GL_FALSE, 6*sizeof(float), 2*sizeof(float));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_BLEND);

View file

@ -440,6 +440,15 @@ GL3_Init(void)
R_Printf(PRINT_ALL, "Refresh: " REF_VERSION "\n");
if(sizeof(float) != sizeof(GLfloat))
{
// if this ever happens, things would explode because we feed vertex arrays and UBO data
// using floats to OpenGL, which expects GLfloat (can't easily change, those floats are from HMM etc)
// (but to be honest I very much doubt this will ever happen.)
R_Printf(PRINT_ALL, "ref_gl3: sizeof(float) != sizeof(GLfloat) - we're in real trouble here.\n");
return false;
}
GL3_Draw_GetPalette();
GL3_Register();
@ -826,17 +835,7 @@ GL3_SetGL2D(void)
hmm_mat4 transMatr = HMM_Orthographic(0, vid.width, vid.height, 0, -99999, 99999);
/*
glUseProgram(gl3state.si2Dcolor.shaderProgram);
glUniformMatrix4fv(gl3state.si2Dcolor.uniProjMatrix , 1, GL_FALSE, transMatr.Elements[0]);
glUseProgram(gl3state.si2D.shaderProgram);
glUniformMatrix4fv(gl3state.si2D.uniProjMatrix , 1, GL_FALSE, transMatr.Elements[0]);
*/
//memcpy(gl3state.uni2DData.transMat4, transMatr.Elements, 4*4*sizeof(GLfloat));
for(int i=0; i<4; ++i)
for(int j=0; j<4; ++j)
gl3state.uni2DData.transMat4[i][j] = transMatr.Elements[i][j];
gl3state.uni2DData.transMat4 = transMatr;
GL3_UpdateUBO2D();
@ -940,8 +939,8 @@ SetupGL(void)
gl3_world_matrix = viewMat;
}
memcpy(gl3state.uni3DData.transProjMat4, gl3_projectionMatrix.Elements, sizeof(gl3state.uni3DData.transProjMat4));
memcpy(gl3state.uni3DData.transModelViewMat4, gl3_world_matrix.Elements, sizeof(gl3state.uni3DData.transProjMat4));
gl3state.uni3DData.transProjMat4 = gl3_projectionMatrix;
gl3state.uni3DData.transModelViewMat4 = gl3_world_matrix;
gl3state.uni3DData.time = gl3_newrefdef.time;

View file

@ -413,35 +413,10 @@ initShader2D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS
R_Printf(PRINT_ALL, "WARNING: OpenGL driver disagrees with us about UBO size of 'uniCommon': %i vs %i\n",
blockSize, (int)sizeof(gl3state.uniCommonData));
// TODO: clean up?
return false;
goto err_cleanup;
}
const GLchar *names[] = { "gamma", "intensity", "color" };
GLuint indices[3];
glGetUniformIndices(prog, 3, names, indices);
GLint offset[3];
glGetActiveUniformsiv(prog, 3, indices, GL_UNIFORM_OFFSET, offset);
printf("## uniCommon offsets in shader:");
for(int i=0; i<3; ++i)
{
printf(" offset of '%s' is %d", names[i], offset[i]);
}
printf("\n");
printf("## offsets in C: gamma: %zd intensity: %zd color: %zd\n",
offsetof(gl3UniCommon_t, gamma),
offsetof(gl3UniCommon_t, intensity),
offsetof(gl3UniCommon_t, color));
glUniformBlockBinding(prog, blockIndex, GL3_BINDINGPOINT_UNICOMMON);
// TODO: something with glUniformBlockBinding() !
}
else
{
@ -457,8 +432,7 @@ initShader2D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS
if(blockSize != sizeof(gl3state.uni2DData))
{
R_Printf(PRINT_ALL, "WARNING: OpenGL driver disagrees with us about UBO size of 'uni2D'\n");
// TODO: clean up?
return false;
goto err_cleanup;
}
glUniformBlockBinding(prog, blockIndex, GL3_BINDINGPOINT_UNI2D);
@ -466,11 +440,18 @@ initShader2D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS
else
{
R_Printf(PRINT_ALL, "WARNING: Couldn't find uniform block index 'uni2D'\n");
// TODO: clean up?
return false;
goto err_cleanup;
}
return true;
err_cleanup:
if(shaders2D[0] != 0) glDeleteShader(shaders2D[0]);
if(shaders2D[1] != 0) glDeleteShader(shaders2D[1]);
if(prog != 0) glDeleteProgram(prog);
return false;
}
static qboolean
@ -485,7 +466,6 @@ initShader3D(gl3ShaderInfo_t* shaderInfo, const char* vertSrc, const char* fragS
glDeleteProgram(shaderInfo->shaderProgram);
}
//shaderInfo->uniColor = shaderInfo->uniProjMatrix = shaderInfo->uniModelViewMatrix = -1;
shaderInfo->shaderProgram = 0;
shaders3D[0] = CompileShader(GL_VERTEX_SHADER, vertexCommon3D, vertSrc);
@ -571,8 +551,7 @@ static void initUBOs(void)
{
gl3state.uniCommonData.gamma = 1.0f/vid_gamma->value;
gl3state.uniCommonData.intensity = intensity->value;
GLfloat color[4] = {1, 1, 1, 1};
memcpy(gl3state.uniCommonData.color, color, sizeof(color));
gl3state.uniCommonData.color = HMM_Vec4(1, 1, 1, 1);
glGenBuffers(1, &gl3state.uniCommonUBO);
glBindBuffer(GL_UNIFORM_BUFFER, gl3state.uniCommonUBO);
@ -580,16 +559,16 @@ static void initUBOs(void)
glBufferData(GL_UNIFORM_BUFFER, sizeof(gl3state.uniCommonData), &gl3state.uniCommonData, GL_DYNAMIC_DRAW);
// the matrix will be set to something more useful later, before being used
memset(gl3state.uni2DData.transMat4, 0, sizeof(gl3state.uni2DData.transMat4));
gl3state.uni2DData.transMat4 = HMM_Mat4();
glGenBuffers(1, &gl3state.uni2DUBO);
glBindBuffer(GL_UNIFORM_BUFFER, gl3state.uni2DUBO);
glBindBufferBase(GL_UNIFORM_BUFFER, GL3_BINDINGPOINT_UNI2D, gl3state.uni2DUBO);
glBufferData(GL_UNIFORM_BUFFER, sizeof(gl3state.uni2DData), &gl3state.uni2DData, GL_DYNAMIC_DRAW);
memset(&gl3state.uni3DData, 0, sizeof(gl3state.uni3DData));
// the matrices will be set to something more useful later, before being used
gl3state.uni3DData.transProjMat4 = HMM_Mat4();
gl3state.uni3DData.transModelViewMat4 = HMM_Mat4();
gl3state.uni3DData.scroll = 0.0f;
gl3state.uni3DData.time = 0.0f;
gl3state.uni3DData.alpha = 1.0f;

View file

@ -624,8 +624,7 @@ GL3_DrawAlphaSurfaces(void)
float intens;
/* go back to the world matrix */
//glLoadMatrixf(r_world_matrix);
memcpy(gl3state.uni3DData.transModelViewMat4, gl3_world_matrix.Elements, 16*sizeof(float));
gl3state.uni3DData.transModelViewMat4 = gl3_world_matrix;
GL3_UpdateUBO3D();
glEnable(GL_BLEND);

View file

@ -118,21 +118,21 @@ typedef struct
GLfloat intensity;
// entries of std140 UBOs are aligned to multiples of their own size
// so we'll need to pad accordingly
// so we'll need to pad accordingly for following vec4
GLfloat _padding[2];
GLfloat color[4];
hmm_vec4 color;
} gl3UniCommon_t;
typedef struct
{
GLfloat transMat4[4][4];
hmm_mat4 transMat4;
} gl3Uni2D_t;
typedef struct
{
GLfloat transProjMat4[4][4];
GLfloat transModelViewMat4[4][4];
hmm_mat4 transProjMat4;
hmm_mat4 transModelViewMat4;
GLfloat scroll; // for SURF_FLOWING
GLfloat time; // for warping surfaces like water & possibly other things