[Mesa-dev] [PATCH 2/4] mesa: Remove unnecessary locking from container objects.
Timothy Arceri
tarceri at itsqueeze.com
Fri Apr 21 05:20:53 UTC 2017
From: Matt Turner <mattst88 at gmail.com>
>From Chapter 5 'Shared Objects and Multiple Contexts' of
the OpenGL 4.5 spec:
"Objects which contain references to other objects include
framebuffer, program pipeline, query, transform feedback,
and vertex array objects. Such objects are called container
objects and are not shared"
For we leave locking in place for framebuffer objects because
the EXT fbo extension allowed sharing.
V2: (Timothy Arceri)
- rebased and dropped changes to framebuffer objects
---
src/mesa/main/arrayobj.c | 6 ------
src/mesa/main/mtypes.h | 4 ----
src/mesa/main/pipelineobj.c | 6 ------
src/mesa/main/shaderapi.c | 3 ---
4 files changed, 19 deletions(-)
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
index fdb3caa..9f4477e 100644
--- a/src/mesa/main/arrayobj.c
+++ b/src/mesa/main/arrayobj.c
@@ -162,21 +162,20 @@ _mesa_new_vao(struct gl_context *ctx, GLuint name)
/**
* Delete an array object.
*/
void
_mesa_delete_vao(struct gl_context *ctx, struct gl_vertex_array_object *obj)
{
unbind_array_object_vbos(ctx, obj);
_mesa_reference_buffer_object(ctx, &obj->IndexBufferObj, NULL);
- mtx_destroy(&obj->Mutex);
free(obj->Label);
free(obj);
}
/**
* Set ptr to vao w/ reference counting.
* Note: this should only be called from the _mesa_reference_vao()
* inline function.
*/
@@ -185,41 +184,37 @@ _mesa_reference_vao_(struct gl_context *ctx,
struct gl_vertex_array_object **ptr,
struct gl_vertex_array_object *vao)
{
assert(*ptr != vao);
if (*ptr) {
/* Unreference the old array object */
GLboolean deleteFlag = GL_FALSE;
struct gl_vertex_array_object *oldObj = *ptr;
- mtx_lock(&oldObj->Mutex);
assert(oldObj->RefCount > 0);
oldObj->RefCount--;
deleteFlag = (oldObj->RefCount == 0);
- mtx_unlock(&oldObj->Mutex);
if (deleteFlag)
_mesa_delete_vao(ctx, oldObj);
*ptr = NULL;
}
assert(!*ptr);
if (vao) {
/* reference new array object */
- mtx_lock(&vao->Mutex);
assert(vao->RefCount > 0);
vao->RefCount++;
*ptr = vao;
- mtx_unlock(&vao->Mutex);
}
}
/**
* Initialize attribtes of a vertex array within a vertex array object.
* \param vao the container vertex array object
* \param index which array in the VAO to initialize
* \param size number of components (1, 2, 3 or 4) per attribute
* \param type datatype of the attribute (GL_FLOAT, GL_INT, etc).
@@ -261,21 +256,20 @@ init_array(struct gl_context *ctx,
*/
void
_mesa_initialize_vao(struct gl_context *ctx,
struct gl_vertex_array_object *vao,
GLuint name)
{
GLuint i;
vao->Name = name;
- mtx_init(&vao->Mutex, mtx_plain);
vao->RefCount = 1;
/* Init the individual arrays */
for (i = 0; i < ARRAY_SIZE(vao->VertexAttrib); i++) {
switch (i) {
case VERT_ATTRIB_WEIGHT:
init_array(ctx, vao, VERT_ATTRIB_WEIGHT, 1, GL_FLOAT);
break;
case VERT_ATTRIB_NORMAL:
init_array(ctx, vao, VERT_ATTRIB_NORMAL, 3, GL_FLOAT);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index c4fab9d..b3711ba 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1502,22 +1502,20 @@ struct gl_vertex_buffer_binding
*/
struct gl_vertex_array_object
{
/** Name of the VAO as received from glGenVertexArray. */
GLuint Name;
GLint RefCount;
GLchar *Label; /**< GL_KHR_debug */
- mtx_t Mutex;
-
/**
* Does the VAO use ARB semantics or Apple semantics?
*
* There are several ways in which ARB_vertex_array_object and
* APPLE_vertex_array_object VAOs have differing semantics. At the very
* least,
*
* - ARB VAOs require that all array data be sourced from vertex buffer
* objects, but Apple VAOs do not.
*
@@ -2994,22 +2992,20 @@ struct gl_shader_program
*/
struct gl_pipeline_object
{
/** Name of the pipeline object as received from glGenProgramPipelines.
* It would be 0 for shaders without separate shader objects.
*/
GLuint Name;
GLint RefCount;
- mtx_t Mutex;
-
GLchar *Label; /**< GL_KHR_debug */
/**
* Programs used for rendering
*
* There is a separate program set for each shader stage.
*/
struct gl_program *CurrentProgram[MESA_SHADER_STAGES];
struct gl_shader_program *ReferencedPrograms[MESA_SHADER_STAGES];
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c
index 2988c97..a0fa55a 100644
--- a/src/mesa/main/pipelineobj.c
+++ b/src/mesa/main/pipelineobj.c
@@ -59,35 +59,33 @@ _mesa_delete_pipeline_object(struct gl_context *ctx,
unsigned i;
_mesa_reference_program(ctx, &obj->_CurrentFragmentProgram, NULL);
for (i = 0; i < MESA_SHADER_STAGES; i++) {
_mesa_reference_program(ctx, &obj->CurrentProgram[i], NULL);
_mesa_reference_shader_program(ctx, &obj->ReferencedPrograms[i], NULL);
}
_mesa_reference_shader_program(ctx, &obj->ActiveProgram, NULL);
- mtx_destroy(&obj->Mutex);
free(obj->Label);
ralloc_free(obj);
}
/**
* Allocate and initialize a new pipeline object.
*/
static struct gl_pipeline_object *
_mesa_new_pipeline_object(struct gl_context *ctx, GLuint name)
{
struct gl_pipeline_object *obj = rzalloc(NULL, struct gl_pipeline_object);
if (obj) {
obj->Name = name;
- mtx_init(&obj->Mutex, mtx_plain);
obj->RefCount = 1;
obj->Flags = _mesa_get_shader_flags();
obj->InfoLog = NULL;
}
return obj;
}
/**
* Initialize pipeline object state for given context.
@@ -182,42 +180,38 @@ _mesa_reference_pipeline_object_(struct gl_context *ctx,
struct gl_pipeline_object **ptr,
struct gl_pipeline_object *obj)
{
assert(*ptr != obj);
if (*ptr) {
/* Unreference the old pipeline object */
GLboolean deleteFlag = GL_FALSE;
struct gl_pipeline_object *oldObj = *ptr;
- mtx_lock(&oldObj->Mutex);
assert(oldObj->RefCount > 0);
oldObj->RefCount--;
deleteFlag = (oldObj->RefCount == 0);
- mtx_unlock(&oldObj->Mutex);
if (deleteFlag) {
_mesa_delete_pipeline_object(ctx, oldObj);
}
*ptr = NULL;
}
assert(!*ptr);
if (obj) {
/* reference new pipeline object */
- mtx_lock(&obj->Mutex);
assert(obj->RefCount > 0);
obj->RefCount++;
*ptr = obj;
- mtx_unlock(&obj->Mutex);
}
}
static void
use_program_stage(struct gl_context *ctx, GLenum type,
struct gl_shader_program *shProg,
struct gl_pipeline_object *pipe) {
gl_shader_stage stage = _mesa_shader_enum_to_shader_stage(type);
struct gl_program *prog = NULL;
if (shProg && shProg->_LinkedShaders[stage])
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 187475f..c41f006 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -131,22 +131,20 @@ _mesa_init_shader_state(struct gl_context *ctx)
for (sh = 0; sh < MESA_SHADER_STAGES; ++sh)
memcpy(&ctx->Const.ShaderCompilerOptions[sh], &options, sizeof(options));
ctx->Shader.Flags = _mesa_get_shader_flags();
if (ctx->Shader.Flags != 0)
ctx->Const.GenerateTemporaryNames = true;
/* Extended for ARB_separate_shader_objects */
ctx->Shader.RefCount = 1;
- mtx_init(&ctx->Shader.Mutex, mtx_plain);
-
ctx->TessCtrlProgram.patch_vertices = 3;
for (i = 0; i < 4; ++i)
ctx->TessCtrlProgram.patch_default_outer_level[i] = 1.0;
for (i = 0; i < 2; ++i)
ctx->TessCtrlProgram.patch_default_inner_level[i] = 1.0;
}
/**
* Free the per-context shader-related state.
@@ -157,21 +155,20 @@ _mesa_free_shader_state(struct gl_context *ctx)
for (int i = 0; i < MESA_SHADER_STAGES; i++) {
_mesa_reference_program(ctx, &ctx->Shader.CurrentProgram[i], NULL);
}
_mesa_reference_program(ctx, &ctx->Shader._CurrentFragmentProgram, NULL);
_mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL);
/* Extended for ARB_separate_shader_objects */
_mesa_reference_pipeline_object(ctx, &ctx->_Shader, NULL);
assert(ctx->Shader.RefCount == 1);
- mtx_destroy(&ctx->Shader.Mutex);
}
/**
* Copy string from <src> to <dst>, up to maxLength characters, returning
* length of <dst> in <length>.
* \param src the strings source
* \param maxLength max chars to copy
* \param length returns number of chars copied
* \param dst the string destination
--
2.9.3
More information about the mesa-dev
mailing list