Skip to content

Commit

Permalink
OpenGL2: Direct state access, part 2: Uniforms.
Browse files Browse the repository at this point in the history
  • Loading branch information
SmileTheory committed Jan 19, 2016
1 parent 275317f commit f70e9da
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 78 deletions.
14 changes: 14 additions & 0 deletions code/renderercommon/qgl.h
Expand Up @@ -753,6 +753,20 @@ extern GLvoid(APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum
GLsizei imageSize, const GLvoid *data);
extern GLvoid(APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target);

extern GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0);
extern GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
extern GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location,
GLfloat v0, GLfloat v1);
extern GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2);
extern GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
extern GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location,
GLsizei count, const GLfloat *value);
extern GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location,
GLsizei count, GLboolean transpose,
const GLfloat *value);


#if defined(WIN32)
// WGL_ARB_create_context
Expand Down
71 changes: 69 additions & 2 deletions code/renderergl2/tr_dsa.c
Expand Up @@ -26,6 +26,8 @@ static struct
{
GLuint textures[NUM_TEXTURE_BUNDLES];
GLenum texunit;

GLuint program;
}
glDsaState;

Expand Down Expand Up @@ -55,15 +57,16 @@ void GL_BindNullTextures()
}
}

void GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
int GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
{
GLuint tmu = texunit - GL_TEXTURE0_ARB;

if (glDsaState.textures[tmu] == texture)
return;
return 0;

qglBindMultiTexture(texunit, target, texture);
glDsaState.textures[tmu] = texture;
return 1;
}

GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture)
Expand Down Expand Up @@ -130,3 +133,67 @@ GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target)
GL_BindMultiTexture(glDsaState.texunit, target, texture);
qglGenerateMipmapEXT(target);
}

void GL_BindNullProgram()
{
qglUseProgramObjectARB(0);
glDsaState.program = 0;
}

int GL_UseProgramObject(GLuint program)
{
if (glDsaState.program == program)
return 0;

qglUseProgramObjectARB(program);
glDsaState.program = program;
return 1;
}

GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0)
{
GL_UseProgramObject(program);
qglUniform1iARB(location, v0);
}

GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
{
GL_UseProgramObject(program);
qglUniform1fARB(location, v0);
}

GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
GLfloat v0, GLfloat v1)
{
GL_UseProgramObject(program);
qglUniform2fARB(location, v0, v1);
}

GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2)
{
GL_UseProgramObject(program);
qglUniform3fARB(location, v0, v1, v2);
}

GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)
{
GL_UseProgramObject(program);
qglUniform4fARB(location, v0, v1, v2, v3);
}

GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
GLsizei count, const GLfloat *value)
{
GL_UseProgramObject(program);
qglUniform1fvARB(location, count, value);
}

GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
GLsizei count, GLboolean transpose,
const GLfloat *value)
{
GL_UseProgramObject(program);
qglUniformMatrix4fvARB(location, count, transpose, value);
}
19 changes: 18 additions & 1 deletion code/renderergl2/tr_dsa.h
Expand Up @@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "../renderercommon/qgl.h"

void GL_BindNullTextures(void);
void GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);
int GL_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);

GLvoid APIENTRY GLDSA_BindMultiTexture(GLenum texunit, GLenum target, GLuint texture);
GLvoid APIENTRY GLDSA_TextureParameterf(GLuint texture, GLenum target, GLenum pname, GLfloat param);
Expand All @@ -43,4 +43,21 @@ GLvoid APIENTRY GLDSA_CompressedTextureSubImage2D(GLuint texture, GLenum target,

GLvoid APIENTRY GLDSA_GenerateTextureMipmap(GLuint texture, GLenum target);

void GL_BindNullProgram(void);
int GL_UseProgramObject(GLuint program);

GLvoid APIENTRY GLDSA_ProgramUniform1i(GLuint program, GLint location, GLint v0);
GLvoid APIENTRY GLDSA_ProgramUniform1f(GLuint program, GLint location, GLfloat v0);
GLvoid APIENTRY GLDSA_ProgramUniform2f(GLuint program, GLint location,
GLfloat v0, GLfloat v1);
GLvoid APIENTRY GLDSA_ProgramUniform3f(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2);
GLvoid APIENTRY GLDSA_ProgramUniform4f(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
GLvoid APIENTRY GLDSA_ProgramUniform1fv(GLuint program, GLint location,
GLsizei count, const GLfloat *value);
GLvoid APIENTRY GLDSA_ProgramUniformMatrix4fv(GLuint program, GLint location,
GLsizei count, GLboolean transpose,
const GLfloat *value);

#endif
32 changes: 32 additions & 0 deletions code/renderergl2/tr_extensions.c
Expand Up @@ -202,6 +202,20 @@ GLvoid (APIENTRY * qglCompressedTextureSubImage2D)(GLuint texture, GLenum target
GLsizei imageSize, const GLvoid *data);
GLvoid (APIENTRY * qglGenerateTextureMipmap)(GLuint texture, GLenum target);

GLvoid(APIENTRY * qglProgramUniform1i)(GLuint program, GLint location, GLint v0);
GLvoid(APIENTRY * qglProgramUniform1f)(GLuint program, GLint location, GLfloat v0);
GLvoid(APIENTRY * qglProgramUniform2f)(GLuint program, GLint location,
GLfloat v0, GLfloat v1);
GLvoid(APIENTRY * qglProgramUniform3f)(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2);
GLvoid(APIENTRY * qglProgramUniform4f)(GLuint program, GLint location,
GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
GLvoid(APIENTRY * qglProgramUniform1fv)(GLuint program, GLint location,
GLsizei count, const GLfloat *value);
GLvoid(APIENTRY * qglProgramUniformMatrix4fv)(GLuint program, GLint location,
GLsizei count, GLboolean transpose,
const GLfloat *value);

static qboolean GLimp_HaveExtension(const char *ext)
{
const char *ptr = Q_stristr( glConfig.extensions_string, ext );
Expand Down Expand Up @@ -770,6 +784,7 @@ void GLimp_InitExtraExtensions()

// GL_EXT_direct_state_access
extension = "GL_EXT_direct_state_access";

qglBindMultiTexture = GLDSA_BindMultiTexture;
qglTextureParameterf = GLDSA_TextureParameterf;
qglTextureParameteri = GLDSA_TextureParameteri;
Expand All @@ -779,6 +794,15 @@ void GLimp_InitExtraExtensions()
qglCompressedTextureImage2D = GLDSA_CompressedTextureImage2D;
qglCompressedTextureSubImage2D = GLDSA_CompressedTextureSubImage2D;
qglGenerateTextureMipmap = GLDSA_GenerateTextureMipmap;

qglProgramUniform1i = GLDSA_ProgramUniform1i;
qglProgramUniform1f = GLDSA_ProgramUniform1f;
qglProgramUniform2f = GLDSA_ProgramUniform2f;
qglProgramUniform3f = GLDSA_ProgramUniform3f;
qglProgramUniform4f = GLDSA_ProgramUniform4f;
qglProgramUniform1fv = GLDSA_ProgramUniform1fv;
qglProgramUniformMatrix4fv = GLDSA_ProgramUniformMatrix4fv;

glRefConfig.directStateAccess = qfalse;
if (GLimp_HaveExtension(extension))
{
Expand All @@ -794,6 +818,14 @@ void GLimp_InitExtraExtensions()
qglCompressedTextureImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureImage2DEXT");
qglCompressedTextureSubImage2D = (void *)SDL_GL_GetProcAddress("glCompressedTextureSubImage2DEXT");
qglGenerateTextureMipmap = (void *)SDL_GL_GetProcAddress("glGenerateTextureMipmapEXT");

qglProgramUniform1i = (void *)SDL_GL_GetProcAddress("glProgramUniform1iEXT");
qglProgramUniform1f = (void *)SDL_GL_GetProcAddress("glProgramUniform1fEXT");
qglProgramUniform2f = (void *)SDL_GL_GetProcAddress("glProgramUniform2fEXT");
qglProgramUniform3f = (void *)SDL_GL_GetProcAddress("glProgramUniform3fEXT");
qglProgramUniform4f = (void *)SDL_GL_GetProcAddress("glProgramUniform4fEXT");
qglProgramUniform1fv = (void *)SDL_GL_GetProcAddress("glProgramUniform1fvEXT");
qglProgramUniformMatrix4fv = (void *)SDL_GL_GetProcAddress("glProgramUniformMatrix4fvEXT");
}

ri.Printf(PRINT_ALL, result[glRefConfig.directStateAccess ? 1 : 0], extension);
Expand Down

0 comments on commit f70e9da

Please sign in to comment.