mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-06 12:10:45 +01:00
ac/nir: Use correct 32-bit component writemask for 64-bit SSBO stores.
Fixes:91074bb11b"radv/ac: Implement Float64 SSBO stores." Tested-by: Timothy Arceri <tarceri@itsqueeze.com> Acked-by: Timothy Arceri <tarceri@itsqueeze.com> (cherry picked from commitf4211e6f93)
This commit is contained in:
parent
a45a6ed808
commit
022cdd4eaa
1 changed files with 13 additions and 9 deletions
|
|
@ -2370,6 +2370,16 @@ static LLVMValueRef visit_get_buffer_size(struct ac_nir_context *ctx,
|
|||
|
||||
return get_buffer_size(ctx, desc, false);
|
||||
}
|
||||
|
||||
static uint32_t widen_mask(uint32_t mask, unsigned multiplier)
|
||||
{
|
||||
uint32_t new_mask = 0;
|
||||
for(unsigned i = 0; i < 32 && (1u << i) <= mask; ++i)
|
||||
if (mask & (1u << i))
|
||||
new_mask |= ((1u << multiplier) - 1u) << (i * multiplier);
|
||||
return new_mask;
|
||||
}
|
||||
|
||||
static void visit_store_ssbo(struct ac_nir_context *ctx,
|
||||
nir_intrinsic_instr *instr)
|
||||
{
|
||||
|
|
@ -2392,6 +2402,8 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,
|
|||
if (components_32bit > 1)
|
||||
data_type = LLVMVectorType(ctx->ac.f32, components_32bit);
|
||||
|
||||
writemask = widen_mask(writemask, elem_size_mult);
|
||||
|
||||
base_data = ac_to_float(&ctx->ac, src_data);
|
||||
base_data = trim_vector(&ctx->ac, base_data, instr->num_components);
|
||||
base_data = LLVMBuildBitCast(ctx->ac.builder, base_data,
|
||||
|
|
@ -2411,9 +2423,6 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,
|
|||
count = 2;
|
||||
}
|
||||
|
||||
start *= elem_size_mult;
|
||||
count *= elem_size_mult;
|
||||
|
||||
if (count > 4) {
|
||||
writemask |= ((1u << (count - 4)) - 1u) << (start + 4);
|
||||
count = 4;
|
||||
|
|
@ -3207,17 +3216,12 @@ visit_store_var(struct ac_nir_context *ctx,
|
|||
NULL, NULL, &const_index, &indir_index);
|
||||
|
||||
if (get_elem_bits(&ctx->ac, LLVMTypeOf(src)) == 64) {
|
||||
int old_writemask = writemask;
|
||||
|
||||
src = LLVMBuildBitCast(ctx->ac.builder, src,
|
||||
LLVMVectorType(ctx->ac.f32, get_llvm_num_components(src) * 2),
|
||||
"");
|
||||
|
||||
writemask = 0;
|
||||
for (unsigned chan = 0; chan < 4; chan++) {
|
||||
if (old_writemask & (1 << chan))
|
||||
writemask |= 3u << (2 * chan);
|
||||
}
|
||||
writemask = widen_mask(writemask, 2);
|
||||
}
|
||||
|
||||
switch (instr->variables[0]->var->data.mode) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue