mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
Cleanup GLhandle-to-object translation macros.
Fix minor bugs.
This commit is contained in:
parent
32c2f939e6
commit
a1a02e6203
2 changed files with 90 additions and 104 deletions
|
|
@ -36,97 +36,79 @@
|
|||
#include "shaderobjects_3dlabs.h"
|
||||
|
||||
|
||||
#define I_UNKNOWN struct gl2_unknown_intf **
|
||||
#define I_GENERIC struct gl2_generic_intf **
|
||||
#define I_CONTAINER struct gl2_container_intf **
|
||||
#define I_PROGRAM struct gl2_program_intf **
|
||||
#define I_SHADER struct gl2_shader_intf **
|
||||
|
||||
#define RELEASE_GENERIC(x)\
|
||||
(**x)._unknown.Release ((I_UNKNOWN) x)
|
||||
(**x)._unknown.Release ((struct gl2_unknown_intf **) (x))
|
||||
|
||||
#define RELEASE_CONTAINER(x)\
|
||||
(**x)._generic._unknown.Release ((I_UNKNOWN) x)
|
||||
(**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
|
||||
|
||||
#define RELEASE_PROGRAM(x)\
|
||||
(**x)._container._generic._unknown.Release ((I_UNKNOWN) x)
|
||||
(**x)._container._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
|
||||
|
||||
#define RELEASE_SHADER(x)\
|
||||
(**x)._generic._unknown.Release ((I_UNKNOWN) x);
|
||||
(**x)._generic._unknown.Release ((struct gl2_unknown_intf **) (x))
|
||||
|
||||
#define _LOOKUP_HANDLE(handle, function)\
|
||||
I_UNKNOWN unk;\
|
||||
_glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
|
||||
unk = (I_UNKNOWN) _mesa_HashLookup (ctx->Shared->GL2Objects, handle);\
|
||||
_glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
|
||||
if (unk == NULL) {\
|
||||
_mesa_error (ctx, GL_INVALID_VALUE, function);\
|
||||
break;\
|
||||
}
|
||||
static struct gl2_unknown_intf **
|
||||
lookup_handle (GLcontext *ctx, GLhandleARB handle, enum gl2_uuid uuid, const char *function)
|
||||
{
|
||||
struct gl2_unknown_intf **unk;
|
||||
|
||||
#define _QUERY_INTERFACE(x, type, uuid, function)\
|
||||
x = (type) (**unk).QueryInterface (unk, uuid);\
|
||||
if (x == NULL) {\
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
|
||||
break;\
|
||||
}
|
||||
/*
|
||||
* Note: _mesa_HashLookup() requires non-zero input values, so the passed-in handle value
|
||||
* must be checked beforehand.
|
||||
*/
|
||||
if (handle == 0) {
|
||||
_mesa_error (ctx, GL_INVALID_VALUE, function);
|
||||
return NULL;
|
||||
}
|
||||
_glthread_LOCK_MUTEX (ctx->Shared->Mutex);
|
||||
unk = (struct gl2_unknown_intf **) (_mesa_HashLookup (ctx->Shared->GL2Objects, handle));
|
||||
_glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
|
||||
if (unk == NULL)
|
||||
_mesa_error (ctx, GL_INVALID_VALUE, function);
|
||||
else {
|
||||
unk = (**unk).QueryInterface (unk, uuid);
|
||||
if (unk == NULL)
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);
|
||||
}
|
||||
return unk;
|
||||
}
|
||||
|
||||
#define GET_GENERIC(x, handle, function)\
|
||||
I_GENERIC x = NULL;\
|
||||
do {\
|
||||
_LOOKUP_HANDLE(handle, function);\
|
||||
_QUERY_INTERFACE(x, I_GENERIC, UIID_GENERIC, function);\
|
||||
} while (0)
|
||||
struct gl2_generic_intf **x = (struct gl2_generic_intf **)\
|
||||
lookup_handle (ctx, handle, UIID_GENERIC, function);
|
||||
|
||||
#define GET_CONTAINER(x, handle, function)\
|
||||
I_CONTAINER x = NULL;\
|
||||
do {\
|
||||
_LOOKUP_HANDLE(handle, function);\
|
||||
_QUERY_INTERFACE(x, I_CONTAINER, UIID_CONTAINER, function);\
|
||||
} while (0)
|
||||
struct gl2_container_intf **x = (struct gl2_container_intf **)\
|
||||
lookup_handle (ctx, handle, UIID_CONTAINER, function);
|
||||
|
||||
#define GET_PROGRAM(x, handle, function)\
|
||||
I_PROGRAM x = NULL;\
|
||||
do {\
|
||||
_LOOKUP_HANDLE(handle, function);\
|
||||
_QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
|
||||
} while (0)
|
||||
struct gl2_program_intf **x = (struct gl2_program_intf **)\
|
||||
lookup_handle (ctx, handle, UIID_PROGRAM, function);
|
||||
|
||||
#define GET_SHADER(x, handle, function)\
|
||||
I_SHADER x = NULL;\
|
||||
do {\
|
||||
_LOOKUP_HANDLE(handle, function);\
|
||||
_QUERY_INTERFACE(x, I_SHADER, UIID_SHADER, function);\
|
||||
} while (0)
|
||||
|
||||
#define _LINKED_PROGRAM(x, function, release)\
|
||||
if ((**x).GetLinkStatus (x) == GL_FALSE) {\
|
||||
if (release) RELEASE_PROGRAM(x);\
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
|
||||
break;\
|
||||
}
|
||||
struct gl2_shader_intf **x = (struct gl2_shader_intf **)\
|
||||
lookup_handle (ctx, handle, UIID_SHADER, function);
|
||||
|
||||
#define GET_LINKED_PROGRAM(x, handle, function)\
|
||||
I_PROGRAM x = NULL;\
|
||||
do {\
|
||||
_LOOKUP_HANDLE(handle, function);\
|
||||
_QUERY_INTERFACE(x, I_PROGRAM, UIID_PROGRAM, function);\
|
||||
_LINKED_PROGRAM(x, function, GL_TRUE);\
|
||||
} while (0)
|
||||
|
||||
#define _CURRENT_PROGRAM(x, function)\
|
||||
if (ctx->ShaderObjects.CurrentProgram == NULL) {\
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
|
||||
break;\
|
||||
}\
|
||||
x = ctx->ShaderObjects.CurrentProgram;
|
||||
GET_PROGRAM(x, handle, function);\
|
||||
if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
|
||||
RELEASE_PROGRAM(x);\
|
||||
x = NULL;\
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
|
||||
}
|
||||
|
||||
#define GET_CURRENT_LINKED_PROGRAM(x, function)\
|
||||
I_PROGRAM x = NULL;\
|
||||
do {\
|
||||
_CURRENT_PROGRAM(x, function);\
|
||||
_LINKED_PROGRAM(x, function, GL_FALSE);\
|
||||
} while (0)
|
||||
struct gl2_program_intf **x = NULL;\
|
||||
if (ctx->ShaderObjects.CurrentProgram == NULL)\
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
|
||||
else {\
|
||||
x = ctx->ShaderObjects.CurrentProgram;\
|
||||
if (x != NULL && (**x).GetLinkStatus (x) == GL_FALSE) {\
|
||||
x = NULL;\
|
||||
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
|
||||
}\
|
||||
}
|
||||
|
||||
#define IS_NAME_WITH_GL_PREFIX(x) ((x)[0] == 'g' && (x)[1] == 'l' && (x)[2] == '_')
|
||||
|
||||
|
|
@ -134,14 +116,17 @@
|
|||
GLvoid GLAPIENTRY
|
||||
_mesa_DeleteObjectARB (GLhandleARB obj)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GET_GENERIC(gen, obj, "glDeleteObjectARB");
|
||||
if (obj != 0)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GET_GENERIC(gen, obj, "glDeleteObjectARB");
|
||||
|
||||
if (gen != NULL)
|
||||
{
|
||||
(**gen).Delete (gen);
|
||||
RELEASE_GENERIC(gen);
|
||||
}
|
||||
if (gen != NULL)
|
||||
{
|
||||
(**gen).Delete (gen);
|
||||
RELEASE_GENERIC(gen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GLhandleARB GLAPIENTRY
|
||||
|
|
@ -151,14 +136,14 @@ _mesa_GetHandleARB (GLenum pname)
|
|||
|
||||
switch (pname)
|
||||
{
|
||||
case GL_PROGRAM_OBJECT_ARB:
|
||||
{
|
||||
I_PROGRAM pro = ctx->ShaderObjects.CurrentProgram;
|
||||
case GL_PROGRAM_OBJECT_ARB:
|
||||
{
|
||||
struct gl2_program_intf **pro = ctx->ShaderObjects.CurrentProgram;
|
||||
|
||||
if (pro != NULL)
|
||||
return (**pro)._container._generic.GetName ((I_GENERIC) pro);
|
||||
}
|
||||
break;
|
||||
if (pro != NULL)
|
||||
return (**pro)._container._generic.GetName ((struct gl2_generic_intf **) (pro));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_mesa_error (ctx, GL_INVALID_ENUM, "glGetHandleARB");
|
||||
}
|
||||
|
|
@ -323,7 +308,7 @@ GLvoid GLAPIENTRY
|
|||
_mesa_UseProgramObjectARB (GLhandleARB programObj)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
I_PROGRAM program = NULL;
|
||||
struct gl2_program_intf **program = NULL;
|
||||
|
||||
FLUSH_VERTICES(ctx, _NEW_PROGRAM);
|
||||
|
||||
|
|
@ -859,16 +844,9 @@ _mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboo
|
|||
case GL_OBJECT_DELETE_STATUS_ARB:
|
||||
*ipar = (**gen).GetDeleteStatus (gen);
|
||||
break;
|
||||
case GL_OBJECT_INFO_LOG_LENGTH_ARB:
|
||||
{
|
||||
const GLcharARB *info = (**gen).GetInfoLog (gen);
|
||||
|
||||
if (info == NULL)
|
||||
*ipar = 0;
|
||||
else
|
||||
*ipar = _mesa_strlen (info) + 1;
|
||||
}
|
||||
break;
|
||||
case GL_OBJECT_INFO_LOG_LENGTH_ARB:
|
||||
*ipar = (**gen).GetInfoLogLength (gen);
|
||||
break;
|
||||
}
|
||||
|
||||
RELEASE_GENERIC(gen);
|
||||
|
|
@ -925,9 +903,9 @@ _mesa_get_object_parameter (GLhandleARB obj, GLenum pname, GLvoid *params, GLboo
|
|||
case GL_OBJECT_VALIDATE_STATUS_ARB:
|
||||
*ipar = (**pro).GetValidateStatus (pro);
|
||||
break;
|
||||
case GL_OBJECT_ATTACHED_OBJECTS_ARB:
|
||||
*ipar = (**pro)._container.GetAttachedCount ((I_CONTAINER) pro);
|
||||
break;
|
||||
case GL_OBJECT_ATTACHED_OBJECTS_ARB:
|
||||
*ipar = (**pro)._container.GetAttachedCount ((struct gl2_container_intf **) (pro));
|
||||
break;
|
||||
case GL_OBJECT_ACTIVE_UNIFORMS_ARB:
|
||||
*ipar = (**pro).GetActiveUniformCount (pro);
|
||||
break;
|
||||
|
|
@ -1037,8 +1015,14 @@ _mesa_GetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLchar
|
|||
|
||||
if (infoLog == NULL)
|
||||
_mesa_error (ctx, GL_INVALID_VALUE, "glGetInfoLogARB");
|
||||
else
|
||||
copy_string ((**gen).GetInfoLog (gen), maxLength, length, infoLog);
|
||||
else {
|
||||
GLsizei actualsize = (**gen).GetInfoLogLength (gen);
|
||||
if (actualsize > maxLength)
|
||||
actualsize = maxLength;
|
||||
(**gen).GetInfoLog (gen, actualsize, infoLog);
|
||||
if (length != NULL)
|
||||
*length = (actualsize > 0) ? actualsize - 1 : 0;
|
||||
}
|
||||
RELEASE_GENERIC(gen);
|
||||
}
|
||||
|
||||
|
|
@ -1066,7 +1050,7 @@ _mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei
|
|||
|
||||
for (i = 0; i < cnt; i++)
|
||||
{
|
||||
I_GENERIC x = (**con).GetAttached (con, i);
|
||||
struct gl2_generic_intf **x = (**con).GetAttached (con, i);
|
||||
obj[i] = (**x).GetName (x);
|
||||
RELEASE_GENERIC(x);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,8 @@ struct gl2_generic_intf
|
|||
GLenum (* GetType) (struct gl2_generic_intf **);
|
||||
GLhandleARB (* GetName) (struct gl2_generic_intf **);
|
||||
GLboolean (* GetDeleteStatus) (struct gl2_generic_intf **);
|
||||
const GLcharARB *(* GetInfoLog) (struct gl2_generic_intf **);
|
||||
GLvoid (* GetInfoLog) (struct gl2_generic_intf **, GLsizei, GLcharARB *);
|
||||
GLsizei (* GetInfoLogLength) (struct gl2_generic_intf **);
|
||||
};
|
||||
|
||||
struct gl2_container_intf
|
||||
|
|
@ -87,8 +88,8 @@ struct gl2_program_intf
|
|||
GLvoid (* Link) (struct gl2_program_intf **);
|
||||
GLvoid (* Validate) (struct gl2_program_intf **);
|
||||
GLvoid (* UpdateFixedUniforms) (struct gl2_program_intf **);
|
||||
GLvoid (* UpdateFixedAttribute) (struct gl2_program_intf **, GLuint, GLvoid *, GLuint, GLuint,
|
||||
GLboolean);
|
||||
GLvoid (* UpdateFixedAttrib) (struct gl2_program_intf **, GLuint, GLvoid *, GLuint, GLuint,
|
||||
GLboolean);
|
||||
GLvoid (* UpdateFixedVarying) (struct gl2_program_intf **, GLuint, GLvoid *, GLuint, GLuint,
|
||||
GLboolean);
|
||||
GLvoid (* GetTextureImageUsage) (struct gl2_program_intf **, GLbitfield *);
|
||||
|
|
@ -106,6 +107,7 @@ struct gl2_program_intf
|
|||
GLuint (* GetActiveAttribCount) (struct gl2_program_intf **);
|
||||
GLint (* GetAttribLocation) (struct gl2_program_intf **, const GLchar *name);
|
||||
GLvoid (* OverrideAttribBinding) (struct gl2_program_intf **, GLuint, const GLchar *);
|
||||
GLvoid (* WriteAttrib) (struct gl2_program_intf **, GLuint, const GLfloat *);
|
||||
GLvoid (* UpdateVarying) (struct gl2_program_intf **, GLuint, GLfloat *, GLboolean);
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue