diff options
author | Michal Krol <mjkrol@gmail.org> | 2006-02-21 12:35:06 +0000 |
---|---|---|
committer | Michal Krol <mjkrol@gmail.org> | 2006-02-21 12:35:06 +0000 |
commit | cc1591667d55a6dbfafbd3d6a7afa9f9288c625d (patch) | |
tree | a3ef92d3a8667e830c94db9441089dbadb45e31a /src/mesa/shader/shaderobjects.c | |
parent | 8986e36f368d11bcf3f1938d77b5df69aa2ee11b (diff) |
More GLSL code:
- uniforms (only GetLocation, Uniform1f and Uniform4fv for now for demos);
- fix bugs and optimize array size handling;
- 2D texture sampling (needs Enable(TEXTURE_2D) to work);
- decrease built-in library assembly size by 30%.
Diffstat (limited to 'src/mesa/shader/shaderobjects.c')
-rw-r--r-- | src/mesa/shader/shaderobjects.c | 121 |
1 files changed, 77 insertions, 44 deletions
diff --git a/src/mesa/shader/shaderobjects.c b/src/mesa/shader/shaderobjects.c index edd74d0f4a..7b18e10d8c 100644 --- a/src/mesa/shader/shaderobjects.c +++ b/src/mesa/shader/shaderobjects.c @@ -318,7 +318,9 @@ void GLAPIENTRY _mesa_UseProgramObjectARB (GLhandleARB programObj) { GET_CURRENT_CONTEXT(ctx); - struct gl2_program_intf **pro; + struct gl2_program_intf **pro;
+
+ FLUSH_VERTICES(ctx, _NEW_PROGRAM); if (programObj == 0) { @@ -411,18 +413,71 @@ Errors TODO Uniform1i{v}ARB is used to load a sampler value. -*/ - +*/
+
+#define _RELEASE_PROGRAM(obj)\
+ (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro)
+
+#define _LOOKUP_PROGRAM(obj, function)\
+ struct gl2_unknown_intf **unk;\
+ _glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
+ unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);\
+ _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
+ if (unk == NULL) {\
+ _mesa_error (ctx, GL_INVALID_VALUE, function);\
+ break;\
+ }\
+ pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);\
+ if (pro == NULL) {\
+ _mesa_error (ctx, GL_INVALID_OPERATION, function);\
+ break;\
+ }
+
+#define _CURRENT_PROGRAM(function)\
+ if (ctx->ShaderObjects.CurrentProgram == NULL) {\
+ _mesa_error (ctx, GL_INVALID_OPERATION, function);\
+ break;\
+ }\
+ pro = ctx->ShaderObjects.CurrentProgram;
+
+#define _IS_LINKED(function)\
+ if ((**pro).GetLinkStatus (pro) == GL_FALSE) {\
+ _mesa_error (ctx, GL_INVALID_OPERATION, function);\
+ _RELEASE_PROGRAM(obj);\
+ break;\
+ }
+
+#define GET_PROGRAM(obj, function)\
+ struct gl2_program_intf **pro = NULL;\
+ do {\
+ _LOOKUP_PROGRAM(obj, function);\
+ } while (0)
+
+#define GET_LINKED_PROGRAM(obj, function)\
+ struct gl2_program_intf **pro = NULL;\
+ do {\
+ _LOOKUP_PROGRAM(obj, function);\
+ _IS_LINKED(function);\
+ } while (0)
+
+#define CURRENT_LINKED_PROGRAM(function)\
+ struct gl2_program_intf **pro = NULL;\
+ do {\
+ _CURRENT_PROGRAM(function);\
+ _IS_LINKED(function);\
+ } while (0)
+
+/* XXX */
+GLboolean _slang_write_uniform (struct gl2_program_intf **, GLint, GLsizei, const GLvoid *, GLenum);
+
void GLAPIENTRY _mesa_Uniform1fARB (GLint location, GLfloat v0) -{ - GET_CURRENT_CONTEXT(ctx); - - if (ctx->ShaderObjects.CurrentProgram == NULL) - { +{
+ GET_CURRENT_CONTEXT(ctx);
+ CURRENT_LINKED_PROGRAM("glUniform1fARB");
+
+ if (!_slang_write_uniform (pro, location, 1, &v0, GL_FLOAT))
_mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB"); - return; - } } void GLAPIENTRY @@ -548,13 +603,11 @@ _mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value) void GLAPIENTRY _mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value) { - GET_CURRENT_CONTEXT(ctx); + GET_CURRENT_CONTEXT(ctx);
+ CURRENT_LINKED_PROGRAM("glUniform4fvARB"); - if (ctx->ShaderObjects.CurrentProgram == NULL) - { + if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC4_ARB))
_mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB"); - return; - } } void GLAPIENTRY @@ -900,43 +953,23 @@ _mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei if (count != NULL) *count = cnt; -} +}
+
+/* XXX */
+GLint _slang_get_uniform_location (struct gl2_program_intf **, const char *); GLint GLAPIENTRY _mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name) { - GET_CURRENT_CONTEXT(ctx); - struct gl2_unknown_intf **unk; - struct gl2_program_intf **pro; + GET_CURRENT_CONTEXT(ctx);
GLint loc = -1; + GET_LINKED_PROGRAM(programObj, "glGetUniformLocationARB"); - _glthread_LOCK_MUTEX (ctx->Shared->Mutex); - unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj); - _glthread_UNLOCK_MUTEX (ctx->Shared->Mutex); - - if (unk == NULL) - { - _mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformLocationARB"); - return -1; - } - - pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM); - if (pro == NULL) - { - _mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformLocationARB"); - return -1; - } - - if ((**pro).GetLinkStatus (pro) == GL_FALSE) - { - _mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformLocationARB"); - (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro); + if (pro == NULL)
return -1; - } - /* TODO */ - - (**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro); + loc = _slang_get_uniform_location (pro, name); + _RELEASE_PROGRAM(pro); return loc; } |