mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 11:30:11 +01:00
mesa: Add {Num}UniformBlocks and {Num}ShaderStorageBlocks to gl_shader{_program}
These arrays provide backends with separate index spaces for UBOS and SSBOs. Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
This commit is contained in:
parent
27dccf097d
commit
d31f98a272
3 changed files with 118 additions and 1 deletions
|
|
@ -3599,6 +3599,42 @@ link_assign_subroutine_types(struct gl_shader_program *prog)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
split_ubos_and_ssbos(void *mem_ctx,
|
||||||
|
struct gl_uniform_block *blocks,
|
||||||
|
unsigned num_blocks,
|
||||||
|
struct gl_uniform_block ***ubos,
|
||||||
|
unsigned *num_ubos,
|
||||||
|
struct gl_uniform_block ***ssbos,
|
||||||
|
unsigned *num_ssbos)
|
||||||
|
{
|
||||||
|
unsigned num_ubo_blocks = 0;
|
||||||
|
unsigned num_ssbo_blocks = 0;
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < num_blocks; i++) {
|
||||||
|
if (blocks[i].IsShaderStorage)
|
||||||
|
num_ssbo_blocks++;
|
||||||
|
else
|
||||||
|
num_ubo_blocks++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ubos = ralloc_array(mem_ctx, gl_uniform_block *, num_ubo_blocks);
|
||||||
|
*num_ubos = 0;
|
||||||
|
|
||||||
|
*ssbos = ralloc_array(mem_ctx, gl_uniform_block *, num_ssbo_blocks);
|
||||||
|
*num_ssbos = 0;
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < num_blocks; i++) {
|
||||||
|
if (blocks[i].IsShaderStorage) {
|
||||||
|
(*ssbos)[(*num_ssbos)++] = &blocks[i];
|
||||||
|
} else {
|
||||||
|
(*ubos)[(*num_ubos)++] = &blocks[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(*num_ubos + *num_ssbos == num_blocks);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||||
{
|
{
|
||||||
|
|
@ -4110,6 +4146,31 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Split BufferInterfaceBlocks into UniformBlocks and ShaderStorageBlocks
|
||||||
|
* for gl_shader_program and gl_shader, so that drivers that need separate
|
||||||
|
* index spaces for each set can have that.
|
||||||
|
*/
|
||||||
|
for (unsigned i = MESA_SHADER_VERTEX; i <= MESA_SHADER_FRAGMENT; i++) {
|
||||||
|
if (prog->_LinkedShaders[i] != NULL) {
|
||||||
|
gl_shader *sh = prog->_LinkedShaders[i];
|
||||||
|
split_ubos_and_ssbos(sh,
|
||||||
|
sh->BufferInterfaceBlocks,
|
||||||
|
sh->NumBufferInterfaceBlocks,
|
||||||
|
&sh->UniformBlocks,
|
||||||
|
&sh->NumUniformBlocks,
|
||||||
|
&sh->ShaderStorageBlocks,
|
||||||
|
&sh->NumShaderStorageBlocks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
split_ubos_and_ssbos(prog,
|
||||||
|
prog->BufferInterfaceBlocks,
|
||||||
|
prog->NumBufferInterfaceBlocks,
|
||||||
|
&prog->UniformBlocks,
|
||||||
|
&prog->NumUniformBlocks,
|
||||||
|
&prog->ShaderStorageBlocks,
|
||||||
|
&prog->NumShaderStorageBlocks);
|
||||||
|
|
||||||
/* FINISHME: Assign fragment shader output locations. */
|
/* FINISHME: Assign fragment shader output locations. */
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,15 @@ _mesa_clear_shader_program_data(struct gl_shader_program *shProg)
|
||||||
ralloc_free(shProg->BufferInterfaceBlocks);
|
ralloc_free(shProg->BufferInterfaceBlocks);
|
||||||
shProg->BufferInterfaceBlocks = NULL;
|
shProg->BufferInterfaceBlocks = NULL;
|
||||||
shProg->NumBufferInterfaceBlocks = 0;
|
shProg->NumBufferInterfaceBlocks = 0;
|
||||||
|
|
||||||
|
ralloc_free(shProg->UniformBlocks);
|
||||||
|
shProg->UniformBlocks = NULL;
|
||||||
|
shProg->NumUniformBlocks = 0;
|
||||||
|
|
||||||
|
ralloc_free(shProg->ShaderStorageBlocks);
|
||||||
|
shProg->ShaderStorageBlocks = NULL;
|
||||||
|
shProg->NumShaderStorageBlocks = 0;
|
||||||
|
|
||||||
for (i = 0; i < MESA_SHADER_STAGES; i++) {
|
for (i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||||
ralloc_free(shProg->UniformBlockStageIndex[i]);
|
ralloc_free(shProg->UniformBlockStageIndex[i]);
|
||||||
shProg->UniformBlockStageIndex[i] = NULL;
|
shProg->UniformBlockStageIndex[i] = NULL;
|
||||||
|
|
|
||||||
|
|
@ -2284,13 +2284,35 @@ struct gl_shader
|
||||||
unsigned num_combined_uniform_components;
|
unsigned num_combined_uniform_components;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This shader's uniform block information.
|
* This shader's uniform/ssbo block information.
|
||||||
*
|
*
|
||||||
* These fields are only set post-linking.
|
* These fields are only set post-linking.
|
||||||
|
*
|
||||||
|
* BufferInterfaceBlocks is a list containing both UBOs and SSBOs. This is
|
||||||
|
* useful during the linking process so that we don't have to handle SSBOs
|
||||||
|
* specifically.
|
||||||
|
*
|
||||||
|
* UniformBlocks is a list of UBOs. This is useful for backends that need
|
||||||
|
* or prefer to see separate index spaces for UBOS and SSBOs like the GL
|
||||||
|
* API specifies.
|
||||||
|
*
|
||||||
|
* ShaderStorageBlocks is a list of SSBOs. This is useful for backends that
|
||||||
|
* need or prefer to see separate index spaces for UBOS and SSBOs like the
|
||||||
|
* GL API specifies.
|
||||||
|
*
|
||||||
|
* UniformBlocks and ShaderStorageBlocks only have pointers into
|
||||||
|
* BufferInterfaceBlocks so the actual resource information is not
|
||||||
|
* duplicated.
|
||||||
*/
|
*/
|
||||||
unsigned NumBufferInterfaceBlocks;
|
unsigned NumBufferInterfaceBlocks;
|
||||||
struct gl_uniform_block *BufferInterfaceBlocks;
|
struct gl_uniform_block *BufferInterfaceBlocks;
|
||||||
|
|
||||||
|
unsigned NumUniformBlocks;
|
||||||
|
struct gl_uniform_block **UniformBlocks;
|
||||||
|
|
||||||
|
unsigned NumShaderStorageBlocks;
|
||||||
|
struct gl_uniform_block **ShaderStorageBlocks;
|
||||||
|
|
||||||
struct exec_list *ir;
|
struct exec_list *ir;
|
||||||
struct exec_list *packed_varyings;
|
struct exec_list *packed_varyings;
|
||||||
struct glsl_symbol_table *symbols;
|
struct glsl_symbol_table *symbols;
|
||||||
|
|
@ -2687,9 +2709,34 @@ struct gl_shader_program
|
||||||
*/
|
*/
|
||||||
unsigned LastClipDistanceArraySize;
|
unsigned LastClipDistanceArraySize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This shader's uniform/ssbo block information.
|
||||||
|
*
|
||||||
|
* BufferInterfaceBlocks is a list containing both UBOs and SSBOs. This is
|
||||||
|
* useful during the linking process so that we don't have to handle SSBOs
|
||||||
|
* specifically.
|
||||||
|
*
|
||||||
|
* UniformBlocks is a list of UBOs. This is useful for backends that need
|
||||||
|
* or prefer to see separate index spaces for UBOS and SSBOs like the GL
|
||||||
|
* API specifies.
|
||||||
|
*
|
||||||
|
* ShaderStorageBlocks is a list of SSBOs. This is useful for backends that
|
||||||
|
* need or prefer to see separate index spaces for UBOS and SSBOs like the
|
||||||
|
* GL API specifies.
|
||||||
|
*
|
||||||
|
* UniformBlocks and ShaderStorageBlocks only have pointers into
|
||||||
|
* BufferInterfaceBlocks so the actual resource information is not
|
||||||
|
* duplicated and are only set after linking.
|
||||||
|
*/
|
||||||
unsigned NumBufferInterfaceBlocks;
|
unsigned NumBufferInterfaceBlocks;
|
||||||
struct gl_uniform_block *BufferInterfaceBlocks;
|
struct gl_uniform_block *BufferInterfaceBlocks;
|
||||||
|
|
||||||
|
unsigned NumUniformBlocks;
|
||||||
|
struct gl_uniform_block **UniformBlocks;
|
||||||
|
|
||||||
|
unsigned NumShaderStorageBlocks;
|
||||||
|
struct gl_uniform_block **ShaderStorageBlocks;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indices into the _LinkedShaders's UniformBlocks[] array for each stage
|
* Indices into the _LinkedShaders's UniformBlocks[] array for each stage
|
||||||
* they're used in, or -1.
|
* they're used in, or -1.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue