X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fshaderobj.c;h=a2478d969759e5932600f839852c41882ed4e497;hb=a2d7f4fe5a52d2968f8d0fbbf879368a6e7044aa;hp=8fd574e5121d01569fa2f2fa575f15b9f7944122;hpb=d2861d682a235993844989f7742c9539c3e10245;p=mesa.git diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index 8fd574e5121..a2478d96975 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -30,8 +30,10 @@ */ +#include "compiler/glsl/string_to_uint_map.h" #include "main/glheader.h" #include "main/context.h" +#include "main/glspirv.h" #include "main/hash.h" #include "main/mtypes.h" #include "main/shaderapi.h" @@ -40,7 +42,7 @@ #include "program/program.h" #include "program/prog_parameter.h" #include "util/ralloc.h" -#include "util/string_to_uint_map.h" +#include "util/u_atomic.h" /**********************************************************************/ /*** Shader object functions ***/ @@ -64,14 +66,11 @@ _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, } if (*ptr) { /* Unreference the old shader */ - GLboolean deleteFlag = GL_FALSE; struct gl_shader *old = *ptr; assert(old->RefCount > 0); - old->RefCount--; - deleteFlag = (old->RefCount == 0); - if (deleteFlag) { + if (p_atomic_dec_zero(&old->RefCount)) { if (old->Name != 0) _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name); _mesa_delete_shader(ctx, old); @@ -83,7 +82,7 @@ _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, if (sh) { /* reference new */ - sh->RefCount++; + p_atomic_inc(&sh->RefCount); *ptr = sh; } } @@ -108,35 +107,24 @@ _mesa_new_shader(GLuint name, gl_shader_stage stage) if (shader) { shader->Stage = stage; shader->Name = name; +#ifdef DEBUG + shader->SourceChecksum = 0xa110c; /* alloc */ +#endif _mesa_init_shader(shader); } return shader; } -/** - * Allocate a new gl_linked_shader object. - * Called via ctx->Driver.NewShader() - */ -struct gl_linked_shader * -_mesa_new_linked_shader(gl_shader_stage stage) -{ - struct gl_linked_shader *shader; - shader = rzalloc(NULL, struct gl_linked_shader); - if (shader) { - shader->Stage = stage; - } - return shader; -} - - /** * Delete a shader object. */ void _mesa_delete_shader(struct gl_context *ctx, struct gl_shader *sh) { + _mesa_shader_spirv_data_reference(&sh->spirv_data, NULL); free((void *)sh->Source); + free((void *)sh->FallbackSource); free(sh->Label); ralloc_free(sh); } @@ -149,6 +137,7 @@ void _mesa_delete_linked_shader(struct gl_context *ctx, struct gl_linked_shader *sh) { + _mesa_shader_spirv_data_reference(&sh->spirv_data, NULL); _mesa_reference_program(ctx, &sh->Program, NULL); ralloc_free(sh); } @@ -207,6 +196,38 @@ _mesa_lookup_shader_err(struct gl_context *ctx, GLuint name, const char *caller) /*** Shader Program object functions ***/ /**********************************************************************/ +void +_mesa_reference_shader_program_data(struct gl_context *ctx, + struct gl_shader_program_data **ptr, + struct gl_shader_program_data *data) +{ + if (*ptr == data) + return; + + if (*ptr) { + struct gl_shader_program_data *oldData = *ptr; + + assert(oldData->RefCount > 0); + + if (p_atomic_dec_zero(&oldData->RefCount)) { + assert(ctx); + assert(oldData->NumUniformStorage == 0 || + oldData->UniformStorage); + + for (unsigned i = 0; i < oldData->NumUniformStorage; ++i) + _mesa_uniform_detach_all_driver_storage(&oldData->UniformStorage[i]); + + ralloc_free(oldData); + } + + *ptr = NULL; + } + + if (data) + p_atomic_inc(&data->RefCount); + + *ptr = data; +} /** * Set ptr to point to shProg. @@ -226,14 +247,11 @@ _mesa_reference_shader_program_(struct gl_context *ctx, } if (*ptr) { /* Unreference the old shader program */ - GLboolean deleteFlag = GL_FALSE; struct gl_shader_program *old = *ptr; assert(old->RefCount > 0); - old->RefCount--; - deleteFlag = (old->RefCount == 0); - if (deleteFlag) { + if (p_atomic_dec_zero(&old->RefCount)) { if (old->Name != 0) _mesa_HashRemove(ctx->Shared->ShaderObjects, old->Name); _mesa_delete_shader_program(ctx, old); @@ -244,11 +262,24 @@ _mesa_reference_shader_program_(struct gl_context *ctx, assert(!*ptr); if (shProg) { - shProg->RefCount++; + p_atomic_inc(&shProg->RefCount); *ptr = shProg; } } +struct gl_shader_program_data * +_mesa_create_shader_program_data() +{ + struct gl_shader_program_data *data; + data = rzalloc(NULL, struct gl_shader_program_data); + if (data) { + data->RefCount = 1; + data->InfoLog = ralloc_strdup(data, ""); + } + + return data; +} + static void init_shader_program(struct gl_shader_program *prog) { @@ -262,13 +293,9 @@ init_shader_program(struct gl_shader_program *prog) prog->Geom.UsesEndPrimitive = false; prog->Geom.UsesStreams = false; - prog->Comp.LocalSizeVariable = false; - prog->TransformFeedback.BufferMode = GL_INTERLEAVED_ATTRIBS; exec_list_make_empty(&prog->EmptyUniformLocations); - - prog->InfoLog = ralloc_strdup(prog, ""); } /** @@ -281,6 +308,11 @@ _mesa_new_shader_program(GLuint name) shProg = rzalloc(NULL, struct gl_shader_program); if (shProg) { shProg->Name = name; + shProg->data = _mesa_create_shader_program_data(); + if (!shProg->data) { + ralloc_free(shProg); + return NULL; + } init_shader_program(shProg); } return shProg; @@ -301,14 +333,6 @@ _mesa_clear_shader_program_data(struct gl_context *ctx, } } - if (shProg->UniformStorage) { - for (unsigned i = 0; i < shProg->NumUniformStorage; ++i) - _mesa_uniform_detach_all_driver_storage(&shProg->UniformStorage[i]); - ralloc_free(shProg->UniformStorage); - shProg->NumUniformStorage = 0; - shProg->UniformStorage = NULL; - } - if (shProg->UniformRemapTable) { ralloc_free(shProg->UniformRemapTable); shProg->NumUniformRemapTable = 0; @@ -320,27 +344,12 @@ _mesa_clear_shader_program_data(struct gl_context *ctx, shProg->UniformHash = NULL; } - assert(shProg->InfoLog != NULL); - ralloc_free(shProg->InfoLog); - shProg->InfoLog = ralloc_strdup(shProg, ""); - - ralloc_free(shProg->UniformBlocks); - shProg->UniformBlocks = NULL; - shProg->NumUniformBlocks = 0; - - ralloc_free(shProg->ShaderStorageBlocks); - shProg->ShaderStorageBlocks = NULL; - shProg->NumShaderStorageBlocks = 0; - - ralloc_free(shProg->AtomicBuffers); - shProg->AtomicBuffers = NULL; - shProg->NumAtomicBuffers = 0; - - if (shProg->ProgramResourceList) { - ralloc_free(shProg->ProgramResourceList); - shProg->ProgramResourceList = NULL; - shProg->NumProgramResourceList = 0; + if (shProg->data && shProg->data->ProgramResourceHash) { + _mesa_hash_table_u64_destroy(shProg->data->ProgramResourceHash, NULL); + shProg->data->ProgramResourceHash = NULL; } + + _mesa_reference_shader_program_data(ctx, &shProg->data, NULL); } @@ -403,7 +412,6 @@ _mesa_delete_shader_program(struct gl_context *ctx, struct gl_shader_program *shProg) { _mesa_free_shader_program_data(ctx, shProg); - ralloc_free(shProg); } @@ -461,6 +469,5 @@ _mesa_lookup_shader_program_err(struct gl_context *ctx, GLuint name, void _mesa_init_shader_object_functions(struct dd_function_table *driver) { - driver->NewShader = _mesa_new_linked_shader; driver->LinkShader = _mesa_ir_link_shader; }