From 00e599e7836804fad0cba8d6112eda12994e36af Mon Sep 17 00:00:00 2001 From: Michal Krol Date: Fri, 25 Mar 2005 12:16:53 +0000 Subject: [PATCH] implement gl2_3dlabs_shhandle interface; resolve few TODOs --- src/mesa/shader/shaderobjects_3dlabs.c | 312 +++++++++++++++++++++---- 1 file changed, 266 insertions(+), 46 deletions(-) diff --git a/src/mesa/shader/shaderobjects_3dlabs.c b/src/mesa/shader/shaderobjects_3dlabs.c index 370670fdfc2..ce56ddfa67c 100755 --- a/src/mesa/shader/shaderobjects_3dlabs.c +++ b/src/mesa/shader/shaderobjects_3dlabs.c @@ -35,7 +35,8 @@ #include "context.h" #include "macros.h" #include "hash.h" - +#include "slang_mesa.h" +#include "Public/ShaderLang.h" struct gl2_unknown_obj { @@ -100,6 +101,59 @@ _unknown_constructor (struct gl2_unknown_impl *impl) impl->_obj._destructor = _unknown_destructor; } +struct gl2_unkinner_obj +{ + struct gl2_unknown_intf **unkouter; +}; + +struct gl2_unkinner_impl +{ + struct gl2_unknown_intf *_vftbl; + struct gl2_unkinner_obj _obj; +}; + +static void +_unkinner_destructor (struct gl2_unknown_intf **intf) +{ +} + +static void +_unkinner_AddRef (struct gl2_unknown_intf **intf) +{ + struct gl2_unkinner_impl *impl = (struct gl2_unkinner_impl *) intf; + + (**impl->_obj.unkouter).AddRef (impl->_obj.unkouter); +} + +static void +_unkinner_Release (struct gl2_unknown_intf **intf) +{ + struct gl2_unkinner_impl *impl = (struct gl2_unkinner_impl *) intf; + + (**impl->_obj.unkouter).Release (impl->_obj.unkouter); +} + +static struct gl2_unknown_intf ** +_unkinner_QueryInterface (struct gl2_unknown_intf **intf, enum gl2_uiid uiid) +{ + struct gl2_unkinner_impl *impl = (struct gl2_unkinner_impl *) intf; + + return (**impl->_obj.unkouter).QueryInterface (impl->_obj.unkouter, uiid); +} + +static struct gl2_unknown_intf _unkinner_vftbl = { + _unkinner_AddRef, + _unkinner_Release, + _unkinner_QueryInterface +}; + +static void +_unkinner_constructor (struct gl2_unkinner_impl *impl, struct gl2_unknown_intf **outer) +{ + impl->_vftbl = &_unkinner_vftbl; + impl->_obj.unkouter = outer; +} + struct gl2_generic_obj { struct gl2_unknown_obj _unknown; @@ -183,7 +237,7 @@ static struct gl2_generic_intf _generic_vftbl = { _generic_QueryInterface }, _generic_Delete, - NULL, + NULL, /* abstract GetType */ _generic_GetName, _generic_GetDeleteStatus, _generic_GetInfoLog @@ -314,18 +368,18 @@ _container_GetAttached (struct gl2_container_intf **intf, GLuint index) } static struct gl2_container_intf _container_vftbl = { - { - { - _unknown_AddRef, - _unknown_Release, - _container_QueryInterface, - }, - _generic_Delete, - NULL, - _generic_GetName, - _generic_GetDeleteStatus, - _generic_GetInfoLog, - }, + { + { + _unknown_AddRef, + _unknown_Release, + _container_QueryInterface + }, + _generic_Delete, + NULL, /* abstract GetType */ + _generic_GetName, + _generic_GetDeleteStatus, + _generic_GetInfoLog + }, _container_Attach, _container_Detach, _container_GetAttachedCount, @@ -342,9 +396,56 @@ _container_constructor (struct gl2_container_impl *impl) impl->_obj.attached_count = 0; } +struct gl2_3dlabs_shhandle_obj +{ + struct gl2_unkinner_obj _unknown; + ShHandle handle; +}; + +struct gl2_3dlabs_shhandle_impl +{ + struct gl2_3dlabs_shhandle_intf *_vftbl; + struct gl2_3dlabs_shhandle_obj _obj; +}; + +static void +_3dlabs_shhandle_destructor (struct gl2_unknown_intf **intf) +{ + struct gl2_3dlabs_shhandle_impl *impl = (struct gl2_3dlabs_shhandle_impl *) intf; + + ShDestruct (impl->_obj.handle); + _unkinner_destructor (intf); +} + +static GLvoid * +_3dlabs_shhandle_GetShHandle (struct gl2_3dlabs_shhandle_intf **intf) +{ + struct gl2_3dlabs_shhandle_impl *impl = (struct gl2_3dlabs_shhandle_impl *) intf; + + return impl->_obj.handle; +} + +static struct gl2_3dlabs_shhandle_intf _3dlabs_shhandle_vftbl = { + { + _unkinner_AddRef, + _unkinner_Release, + _unkinner_QueryInterface + }, + _3dlabs_shhandle_GetShHandle +}; + +static void +_3dlabs_shhandle_constructor (struct gl2_3dlabs_shhandle_impl *impl, struct gl2_unknown_intf **outer) +{ + _unkinner_constructor ((struct gl2_unkinner_impl *) impl, outer); + impl->_vftbl = &_3dlabs_shhandle_vftbl; + impl->_obj.handle = NULL; +} + struct gl2_shader_obj { struct gl2_generic_obj _generic; + struct gl2_3dlabs_shhandle_impl _3dlabs_shhandle; GLboolean compile_status; GLcharARB *source; GLint *offsets; @@ -364,17 +465,25 @@ _shader_destructor (struct gl2_unknown_intf **intf) _mesa_free ((void *) impl->_obj.source); _mesa_free ((void *) impl->_obj.offsets); + _3dlabs_shhandle_destructor ((struct gl2_unknown_intf **) &impl->_obj._3dlabs_shhandle._vftbl); _generic_destructor (intf); } static struct gl2_unknown_intf ** _shader_QueryInterface (struct gl2_unknown_intf **intf, enum gl2_uiid uiid) { + struct gl2_shader_impl *impl = (struct gl2_shader_impl *) intf; + if (uiid == UIID_SHADER) { (**intf).AddRef (intf); return intf; } + if (uiid == UIID_3DLABS_SHHANDLE) + { + (**intf).AddRef (intf); + return (struct gl2_unknown_intf **) &impl->_obj._3dlabs_shhandle._vftbl; + } return _generic_QueryInterface (intf, uiid); } @@ -416,28 +525,93 @@ static GLvoid _shader_Compile (struct gl2_shader_intf **intf) { struct gl2_shader_impl *impl = (struct gl2_shader_impl *) intf; + char **strings; + TBuiltInResource res; impl->_obj.compile_status = GL_FALSE; _mesa_free ((void *) impl->_obj._generic.info_log); impl->_obj._generic.info_log = NULL; - /* TODO compile */ + /* 3dlabs compiler expects us to feed it with null-terminated string array, + we've got only one big string with offsets, so we must split it; but when + there's only one string to deal with, we pass its address directly */ + + if (impl->_obj.offset_count <= 1) + strings = &impl->_obj.source; + else + { + GLsizei i, offset = 0; + + strings = (char **) _mesa_malloc (impl->_obj.offset_count * sizeof (char *)); + if (strings == NULL) + return; + + for (i = 0; i < impl->_obj.offset_count; i++) + { + GLsizei size = impl->_obj.offsets[i] - offset; + + strings[i] = (char *) _mesa_malloc ((size + 1) * sizeof (char)); + if (strings[i] == NULL) + { + GLsizei j; + + for (j = 0; j < i; j++) + _mesa_free (strings[j]); + _mesa_free (strings); + return; + } + + _mesa_memcpy (strings[i], impl->_obj.source + offset, size * sizeof (char)); + strings[i][size] = '\0'; + offset = impl->_obj.offsets[i]; + } + } + + /* TODO set these fields to some REAL numbers */ + res.maxLights = 8; + res.maxClipPlanes = 6; + res.maxTextureUnits = 2; + res.maxTextureCoords = 2; + res.maxVertexAttribs = 8; + res.maxVertexUniformComponents = 64; + res.maxVaryingFloats = 8; + res.maxVertexTextureImageUnits = 2; + res.maxCombinedTextureImageUnits = 2; + res.maxTextureImageUnits = 2; + res.maxFragmentUniformComponents = 64; + res.maxDrawBuffers = 1; + + if (ShCompile (impl->_obj._3dlabs_shhandle._obj.handle, strings, impl->_obj.offset_count, + EShOptFull, &res, 0)) + impl->_obj.compile_status = GL_TRUE; + + if (impl->_obj.offset_count > 1) + { + GLsizei i; + + for (i = 0; i < impl->_obj.offset_count; i++) + _mesa_free (strings[i]); + _mesa_free (strings); + } + + impl->_obj._generic.info_log = _mesa_strdup (ShGetInfoLog ( + impl->_obj._3dlabs_shhandle._obj.handle)); } static struct gl2_shader_intf _shader_vftbl = { - { - { - _unknown_AddRef, - _unknown_Release, - _shader_QueryInterface, - }, - _generic_Delete, - _shader_GetType, - _generic_GetName, - _generic_GetDeleteStatus, - _generic_GetInfoLog, - }, - NULL, + { + { + _unknown_AddRef, + _unknown_Release, + _shader_QueryInterface + }, + _generic_Delete, + _shader_GetType, + _generic_GetName, + _generic_GetDeleteStatus, + _generic_GetInfoLog + }, + NULL, /* abstract GetSubType */ _shader_GetCompileStatus, _shader_SetSource, _shader_GetSource, @@ -448,6 +622,8 @@ static void _shader_constructor (struct gl2_shader_impl *impl) { _generic_constructor ((struct gl2_generic_impl *) impl); + _3dlabs_shhandle_constructor (&impl->_obj._3dlabs_shhandle, (struct gl2_unknown_intf **) + &impl->_vftbl); impl->_vftbl = &_shader_vftbl; impl->_obj._generic._unknown._destructor = _shader_destructor; impl->_obj.compile_status = GL_FALSE; @@ -461,6 +637,8 @@ struct gl2_program_obj struct gl2_container_obj _container; GLboolean link_status; GLboolean validate_status; + ShHandle linker; + ShHandle uniforms; }; struct gl2_program_impl @@ -473,7 +651,9 @@ static void _program_destructor (struct gl2_unknown_intf **intf) { struct gl2_program_impl *impl = (struct gl2_program_impl *) intf; - (void) impl; + + ShDestruct (impl->_obj.linker); + ShDestruct (impl->_obj.uniforms); _container_destructor (intf); } @@ -531,12 +711,41 @@ static GLvoid _program_Link (struct gl2_program_intf **intf) { struct gl2_program_impl *impl = (struct gl2_program_impl *) intf; + ShHandle *handles; + GLuint i; impl->_obj.link_status = GL_FALSE; _mesa_free ((void *) impl->_obj._container._generic.info_log); impl->_obj._container._generic.info_log = NULL; - /* TODO link */ + handles = (ShHandle *) _mesa_malloc (impl->_obj._container.attached_count * sizeof (ShHandle)); + if (handles == NULL) + return; + + for (i = 0; i < impl->_obj._container.attached_count; i++) + { + struct gl2_generic_intf **gen = impl->_obj._container.attached[i]; + struct gl2_3dlabs_shhandle_intf **sh; + + sh = (struct gl2_3dlabs_shhandle_intf **) (**gen)._unknown.QueryInterface ( + (struct gl2_unknown_intf **) gen, UIID_3DLABS_SHHANDLE); + if (sh != NULL) + { + handles[i] = (**sh).GetShHandle (sh); + (**sh)._unknown.Release ((struct gl2_unknown_intf **) sh); + } + else + { + _mesa_free (handles); + return; + } + } + + if (ShLink (impl->_obj.linker, handles, impl->_obj._container.attached_count, + impl->_obj.uniforms, NULL, NULL)) + impl->_obj.link_status = GL_TRUE; + + impl->_obj._container._generic.info_log = _mesa_strdup (ShGetInfoLog (impl->_obj.linker)); } static GLvoid @@ -545,6 +754,8 @@ _program_Validate (struct gl2_program_intf **intf) struct gl2_program_impl *impl = (struct gl2_program_impl *) intf; impl->_obj.validate_status = GL_FALSE; + _mesa_free ((void *) impl->_obj._container._generic.info_log); + impl->_obj._container._generic.info_log = NULL; /* TODO validate */ } @@ -555,18 +766,18 @@ static struct gl2_program_intf _program_vftbl = { { _unknown_AddRef, _unknown_Release, - _program_QueryInterface, + _program_QueryInterface }, _generic_Delete, _program_GetType, _generic_GetName, _generic_GetDeleteStatus, - _generic_GetInfoLog, + _generic_GetInfoLog }, _program_Attach, _container_Detach, _container_GetAttachedCount, - _container_GetAttached, + _container_GetAttached }, _program_GetLinkStatus, _program_GetValidateStatus, @@ -582,6 +793,8 @@ _program_constructor (struct gl2_program_impl *impl) impl->_obj._container._generic._unknown._destructor = _program_destructor; impl->_obj.link_status = GL_FALSE; impl->_obj.validate_status = GL_FALSE; + impl->_obj.linker = ShConstructLinker (EShExVertexFragment, 0); + impl->_obj.uniforms = ShConstructUniformMap (); } struct gl2_fragment_shader_obj @@ -599,6 +812,7 @@ static void _fragment_shader_destructor (struct gl2_unknown_intf **intf) { struct gl2_fragment_shader_impl *impl = (struct gl2_fragment_shader_impl *) intf; + (void) impl; /* TODO free fragment shader data */ @@ -628,13 +842,13 @@ static struct gl2_fragment_shader_intf _fragment_shader_vftbl = { { _unknown_AddRef, _unknown_Release, - _fragment_shader_QueryInterface, + _fragment_shader_QueryInterface }, _generic_Delete, _shader_GetType, _generic_GetName, _generic_GetDeleteStatus, - _generic_GetInfoLog, + _generic_GetInfoLog }, _fragment_shader_GetSubType, _shader_GetCompileStatus, @@ -650,6 +864,7 @@ _fragment_shader_constructor (struct gl2_fragment_shader_impl *impl) _shader_constructor ((struct gl2_shader_impl *) impl); impl->_vftbl = &_fragment_shader_vftbl; impl->_obj._shader._generic._unknown._destructor = _fragment_shader_destructor; + impl->_obj._shader._3dlabs_shhandle._obj.handle = ShConstructCompiler (EShLangFragment, 0); } struct gl2_vertex_shader_obj @@ -667,6 +882,7 @@ static void _vertex_shader_destructor (struct gl2_unknown_intf **intf) { struct gl2_vertex_shader_impl *impl = (struct gl2_vertex_shader_impl *) intf; + (void) impl; /* TODO free vertex shader data */ @@ -696,13 +912,13 @@ static struct gl2_vertex_shader_intf _vertex_shader_vftbl = { { _unknown_AddRef, _unknown_Release, - _vertex_shader_QueryInterface, + _vertex_shader_QueryInterface }, _generic_Delete, _shader_GetType, _generic_GetName, _generic_GetDeleteStatus, - _generic_GetInfoLog, + _generic_GetInfoLog }, _vertex_shader_GetSubType, _shader_GetCompileStatus, @@ -718,19 +934,18 @@ _vertex_shader_constructor (struct gl2_vertex_shader_impl *impl) _shader_constructor ((struct gl2_shader_impl *) impl); impl->_vftbl = &_vertex_shader_vftbl; impl->_obj._shader._generic._unknown._destructor = _vertex_shader_destructor; + impl->_obj._shader._3dlabs_shhandle._obj.handle = ShConstructCompiler (EShLangVertex, 0); } GLhandleARB _mesa_3dlabs_create_shader_object (GLenum shaderType) { - GET_CURRENT_CONTEXT(ctx); - (void) ctx; switch (shaderType) { case GL_FRAGMENT_SHADER_ARB: { - struct gl2_fragment_shader_impl *x = (struct gl2_fragment_shader_impl *) _mesa_malloc ( - sizeof (struct gl2_fragment_shader_impl)); + struct gl2_fragment_shader_impl *x = (struct gl2_fragment_shader_impl *) + _mesa_malloc (sizeof (struct gl2_fragment_shader_impl)); if (x != NULL) { @@ -741,8 +956,8 @@ _mesa_3dlabs_create_shader_object (GLenum shaderType) break; case GL_VERTEX_SHADER_ARB: { - struct gl2_vertex_shader_impl *x = (struct gl2_vertex_shader_impl *) _mesa_malloc ( - sizeof (struct gl2_vertex_shader_impl)); + struct gl2_vertex_shader_impl *x = (struct gl2_vertex_shader_impl *) + _mesa_malloc (sizeof (struct gl2_vertex_shader_impl)); if (x != NULL) { @@ -759,11 +974,9 @@ _mesa_3dlabs_create_shader_object (GLenum shaderType) GLhandleARB _mesa_3dlabs_create_program_object (void) { - GET_CURRENT_CONTEXT(ctx); - struct gl2_program_impl *x = (struct gl2_program_impl *) + struct gl2_program_impl *x = (struct gl2_program_impl *) _mesa_malloc (sizeof (struct gl2_program_impl)); - (void) ctx; if (x != NULL) { _program_constructor (x); @@ -773,3 +986,10 @@ _mesa_3dlabs_create_program_object (void) return 0; } +void +_mesa_init_shaderobjects_3dlabs (GLcontext *ctx) +{ + _glslang_3dlabs_InitProcess (); + _glslang_3dlabs_ShInitialize (); +} + -- 2.30.2