mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-30 21:21:39 +02:00
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:
parent
0dfc5b5196
commit
80b96a2158
2 changed files with 16 additions and 12 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue