diff options
-rw-r--r-- | src/compiler/Makefile.sources | 1 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 76 | ||||
-rw-r--r-- | src/compiler/glsl/linker_util.cpp | 64 | ||||
-rw-r--r-- | src/compiler/glsl/linker_util.h | 5 | ||||
-rw-r--r-- | src/compiler/glsl/meson.build | 1 |
5 files changed, 91 insertions, 56 deletions
diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index ad888c59403..89702a7c5d5 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -75,6 +75,7 @@ LIBGLSL_FILES = \ glsl/linker.cpp \ glsl/linker.h \ glsl/linker_util.h \ + glsl/linker_util.cpp \ glsl/link_atomics.cpp \ glsl/link_functions.cpp \ glsl/link_interface_blocks.cpp \ diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index f6fce2d4e8d..95e7c3c5e99 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -3624,42 +3624,6 @@ should_add_buffer_variable(struct gl_shader_program *shProg, return false; } -static bool -add_program_resource(struct gl_shader_program *prog, - struct set *resource_set, - GLenum type, const void *data, uint8_t stages) -{ - assert(data); - - /* If resource already exists, do not add it again. */ - if (_mesa_set_search(resource_set, data)) - return true; - - prog->data->ProgramResourceList = - reralloc(prog->data, - prog->data->ProgramResourceList, - gl_program_resource, - prog->data->NumProgramResourceList + 1); - - if (!prog->data->ProgramResourceList) { - linker_error(prog, "Out of memory during linking.\n"); - return false; - } - - struct gl_program_resource *res = - &prog->data->ProgramResourceList[prog->data->NumProgramResourceList]; - - res->Type = type; - res->Data = data; - res->StageReferences = stages; - - prog->data->NumProgramResourceList++; - - _mesa_set_add(resource_set, data); - - return true; -} - /* Function checks if a variable var is a packed varying and * if given name is part of packed varying's list. * @@ -3953,8 +3917,8 @@ add_shader_variable(const struct gl_context *ctx, if (!sha_v) return false; - return add_program_resource(shProg, resource_set, - programInterface, sha_v, stage_mask); + return link_util_add_program_resource(shProg, resource_set, + programInterface, sha_v, stage_mask); } } } @@ -4383,9 +4347,9 @@ build_program_resource_list(struct gl_context *ctx, /* Add transform feedback varyings. */ if (linked_xfb->NumVarying > 0) { for (int i = 0; i < linked_xfb->NumVarying; i++) { - if (!add_program_resource(shProg, resource_set, - GL_TRANSFORM_FEEDBACK_VARYING, - &linked_xfb->Varyings[i], 0)) + if (!link_util_add_program_resource(shProg, resource_set, + GL_TRANSFORM_FEEDBACK_VARYING, + &linked_xfb->Varyings[i], 0)) return; } } @@ -4394,9 +4358,9 @@ build_program_resource_list(struct gl_context *ctx, for (unsigned i = 0; i < ctx->Const.MaxTransformFeedbackBuffers; i++) { if ((linked_xfb->ActiveBuffers >> i) & 1) { linked_xfb->Buffers[i].Binding = i; - if (!add_program_resource(shProg, resource_set, - GL_TRANSFORM_FEEDBACK_BUFFER, - &linked_xfb->Buffers[i], 0)) + if (!link_util_add_program_resource(shProg, resource_set, + GL_TRANSFORM_FEEDBACK_BUFFER, + &linked_xfb->Buffers[i], 0)) return; } } @@ -4432,29 +4396,29 @@ build_program_resource_list(struct gl_context *ctx, &shProg->data->UniformStorage[i]); } - if (!add_program_resource(shProg, resource_set, type, - &shProg->data->UniformStorage[i], stageref)) + if (!link_util_add_program_resource(shProg, resource_set, type, + &shProg->data->UniformStorage[i], stageref)) return; } /* Add program uniform blocks. */ for (unsigned i = 0; i < shProg->data->NumUniformBlocks; i++) { - if (!add_program_resource(shProg, resource_set, GL_UNIFORM_BLOCK, - &shProg->data->UniformBlocks[i], 0)) + if (!link_util_add_program_resource(shProg, resource_set, GL_UNIFORM_BLOCK, + &shProg->data->UniformBlocks[i], 0)) return; } /* Add program shader storage blocks. */ for (unsigned i = 0; i < shProg->data->NumShaderStorageBlocks; i++) { - if (!add_program_resource(shProg, resource_set, GL_SHADER_STORAGE_BLOCK, - &shProg->data->ShaderStorageBlocks[i], 0)) + if (!link_util_add_program_resource(shProg, resource_set, GL_SHADER_STORAGE_BLOCK, + &shProg->data->ShaderStorageBlocks[i], 0)) return; } /* Add atomic counter buffers. */ for (unsigned i = 0; i < shProg->data->NumAtomicBuffers; i++) { - if (!add_program_resource(shProg, resource_set, GL_ATOMIC_COUNTER_BUFFER, - &shProg->data->AtomicBuffers[i], 0)) + if (!link_util_add_program_resource(shProg, resource_set, GL_ATOMIC_COUNTER_BUFFER, + &shProg->data->AtomicBuffers[i], 0)) return; } @@ -4470,8 +4434,8 @@ build_program_resource_list(struct gl_context *ctx, type = _mesa_shader_stage_to_subroutine_uniform((gl_shader_stage)j); /* add shader subroutines */ - if (!add_program_resource(shProg, resource_set, - type, &shProg->data->UniformStorage[i], 0)) + if (!link_util_add_program_resource(shProg, resource_set, + type, &shProg->data->UniformStorage[i], 0)) return; } } @@ -4483,8 +4447,8 @@ build_program_resource_list(struct gl_context *ctx, GLuint type = _mesa_shader_stage_to_subroutine((gl_shader_stage)i); for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) { - if (!add_program_resource(shProg, resource_set, - type, &p->sh.SubroutineFunctions[j], 0)) + if (!link_util_add_program_resource(shProg, resource_set, + type, &p->sh.SubroutineFunctions[j], 0)) return; } } diff --git a/src/compiler/glsl/linker_util.cpp b/src/compiler/glsl/linker_util.cpp new file mode 100644 index 00000000000..0e6f4166d64 --- /dev/null +++ b/src/compiler/glsl/linker_util.cpp @@ -0,0 +1,64 @@ +/* + * Copyright © 2018 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ +#include "main/mtypes.h" +#include "linker_util.h" +#include "util/set.h" + +/* Utility methods shared between the GLSL IR and the NIR */ + +bool +link_util_add_program_resource(struct gl_shader_program *prog, + struct set *resource_set, + GLenum type, const void *data, uint8_t stages) +{ + assert(data); + + /* If resource already exists, do not add it again. */ + if (_mesa_set_search(resource_set, data)) + return true; + + prog->data->ProgramResourceList = + reralloc(prog->data, + prog->data->ProgramResourceList, + gl_program_resource, + prog->data->NumProgramResourceList + 1); + + if (!prog->data->ProgramResourceList) { + linker_error(prog, "Out of memory during linking.\n"); + return false; + } + + struct gl_program_resource *res = + &prog->data->ProgramResourceList[prog->data->NumProgramResourceList]; + + res->Type = type; + res->Data = data; + res->StageReferences = stages; + + prog->data->NumProgramResourceList++; + + _mesa_set_add(resource_set, data); + + return true; +} diff --git a/src/compiler/glsl/linker_util.h b/src/compiler/glsl/linker_util.h index 162db3e532f..17da92fca99 100644 --- a/src/compiler/glsl/linker_util.h +++ b/src/compiler/glsl/linker_util.h @@ -36,6 +36,11 @@ linker_error(struct gl_shader_program *prog, const char *fmt, ...); void linker_warning(struct gl_shader_program *prog, const char *fmt, ...); +bool +link_util_add_program_resource(struct gl_shader_program *prog, + struct set *resource_set, + GLenum type, const void *data, uint8_t stages); + #ifdef __cplusplus } #endif diff --git a/src/compiler/glsl/meson.build b/src/compiler/glsl/meson.build index 2605fef9585..88a49c6997e 100644 --- a/src/compiler/glsl/meson.build +++ b/src/compiler/glsl/meson.build @@ -116,6 +116,7 @@ files_libglsl = files( 'linker.cpp', 'linker.h', 'linker_util.h', + 'linker_util.cpp', 'link_atomics.cpp', 'link_functions.cpp', 'link_interface_blocks.cpp', |