st/mesa: adapt for the case where buffers are not supported in frag

Some logic was tuned to buffers / atomics / images being supported in
frag stages in order to expose any support at all. Fix some of these
assumptions.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10161>
This commit is contained in:
Ilia Mirkin 2021-02-24 18:39:25 -05:00
parent 0dfc5b5196
commit 80b96a2158
2 changed files with 16 additions and 12 deletions

View file

@ -510,21 +510,24 @@ void st_init_limits(struct pipe_screen *screen,
c->NumProgramBinaryFormats = 1;
c->MaxAtomicBufferBindings =
c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
c->MaxAtomicBufferSize =
c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters * ATOMIC_COUNTER_SIZE;
MAX2(c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers,
c->Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers);
c->MaxAtomicBufferSize = ATOMIC_COUNTER_SIZE *
MAX2(c->Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters,
c->Program[MESA_SHADER_COMPUTE].MaxAtomicCounters);
c->MaxCombinedAtomicBuffers =
MIN2(screen->get_param(screen,
PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS),
MAX_COMBINED_ATOMIC_BUFFERS);
if (!c->MaxCombinedAtomicBuffers) {
c->MaxCombinedAtomicBuffers =
c->MaxCombinedAtomicBuffers = MAX2(
c->Program[MESA_SHADER_VERTEX].MaxAtomicBuffers +
c->Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers +
c->Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers +
c->Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers +
c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
c->Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers,
c->Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers);
assert(c->MaxCombinedAtomicBuffers <= MAX_COMBINED_ATOMIC_BUFFERS);
}
@ -546,12 +549,13 @@ void st_init_limits(struct pipe_screen *screen,
MIN2(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SHADER_BUFFERS),
MAX_COMBINED_SHADER_STORAGE_BUFFERS);
if (!c->MaxCombinedShaderStorageBlocks) {
c->MaxCombinedShaderStorageBlocks =
c->MaxCombinedShaderStorageBlocks = MAX2(
c->Program[MESA_SHADER_VERTEX].MaxShaderStorageBlocks +
c->Program[MESA_SHADER_TESS_CTRL].MaxShaderStorageBlocks +
c->Program[MESA_SHADER_TESS_EVAL].MaxShaderStorageBlocks +
c->Program[MESA_SHADER_GEOMETRY].MaxShaderStorageBlocks +
c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks;
c->Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks,
c->Program[MESA_SHADER_COMPUTE].MaxShaderStorageBlocks);
assert(c->MaxCombinedShaderStorageBlocks < MAX_COMBINED_SHADER_STORAGE_BUFFERS);
}
c->MaxShaderStorageBufferBindings = c->MaxCombinedShaderStorageBlocks;

View file

@ -6662,8 +6662,8 @@ st_translate_program(
struct pipe_screen *screen = st_context(ctx)->screen;
struct st_translate *t;
unsigned i;
struct gl_program_constants *frag_const =
&ctx->Const.Program[MESA_SHADER_FRAGMENT];
struct gl_program_constants *prog_const =
&ctx->Const.Program[program->shader->Stage];
enum pipe_error ret = PIPE_OK;
assert(numInputs <= ARRAY_SIZE(t->inputs));
@ -6999,7 +6999,7 @@ st_translate_program(
assert(i == program->num_immediates);
/* texture samplers */
for (i = 0; i < frag_const->MaxTextureImageUnits; i++) {
for (i = 0; i < prog_const->MaxTextureImageUnits; i++) {
if (program->samplers_used & (1u << i)) {
enum tgsi_return_type type =
st_translate_texture_type(program->sampler_types[i]);
@ -7020,7 +7020,7 @@ st_translate_program(
unsigned index = (prog->info.num_ssbos +
prog->sh.AtomicBuffers[i]->Binding);
assert(prog->sh.AtomicBuffers[i]->Binding <
frag_const->MaxAtomicBuffers);
prog_const->MaxAtomicBuffers);
t->buffers[index] = ureg_DECL_buffer(ureg, index, true);
}
} else {
@ -7033,7 +7033,7 @@ st_translate_program(
}
}
assert(prog->info.num_ssbos <= frag_const->MaxShaderStorageBlocks);
assert(prog->info.num_ssbos <= prog_const->MaxShaderStorageBlocks);
for (i = 0; i < prog->info.num_ssbos; i++) {
t->buffers[i] = ureg_DECL_buffer(ureg, i, false);
}