zink: support non-const offsets
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7079>
This commit is contained in:
committed by
Marge Bot
parent
47bdda0f3f
commit
67e4bcb713
@@ -1562,51 +1562,46 @@ emit_load_ubo_vec4(struct ntv_context *ctx, nir_intrinsic_instr *intr)
|
||||
assert(const_block_index); // no dynamic indexing for now
|
||||
assert(const_block_index->u32 == 0); // we only support the default UBO for now
|
||||
|
||||
nir_const_value *const_offset = nir_src_as_const_value(intr->src[1]);
|
||||
if (const_offset) {
|
||||
SpvId uvec4_type = get_uvec_type(ctx, 32, 4);
|
||||
SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder,
|
||||
SpvStorageClassUniform,
|
||||
uvec4_type);
|
||||
SpvId offset = get_src(ctx, &intr->src[1]);
|
||||
SpvId uvec4_type = get_uvec_type(ctx, 32, 4);
|
||||
SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder,
|
||||
SpvStorageClassUniform,
|
||||
uvec4_type);
|
||||
|
||||
unsigned idx = const_offset->u32;
|
||||
SpvId member = emit_uint_const(ctx, 32, 0);
|
||||
SpvId offset = emit_uint_const(ctx, 32, idx);
|
||||
SpvId offsets[] = { member, offset };
|
||||
SpvId ptr = spirv_builder_emit_access_chain(&ctx->builder, pointer_type,
|
||||
ctx->ubos[0], offsets,
|
||||
ARRAY_SIZE(offsets));
|
||||
SpvId result = spirv_builder_emit_load(&ctx->builder, uvec4_type, ptr);
|
||||
SpvId member = emit_uint_const(ctx, 32, 0);
|
||||
SpvId offsets[] = { member, offset };
|
||||
SpvId ptr = spirv_builder_emit_access_chain(&ctx->builder, pointer_type,
|
||||
ctx->ubos[0], offsets,
|
||||
ARRAY_SIZE(offsets));
|
||||
SpvId result = spirv_builder_emit_load(&ctx->builder, uvec4_type, ptr);
|
||||
|
||||
SpvId type = get_dest_uvec_type(ctx, &intr->dest);
|
||||
unsigned num_components = nir_dest_num_components(intr->dest);
|
||||
if (num_components == 1) {
|
||||
uint32_t components[] = { 0 };
|
||||
result = spirv_builder_emit_composite_extract(&ctx->builder,
|
||||
type,
|
||||
result, components,
|
||||
1);
|
||||
} else if (num_components < 4) {
|
||||
SpvId constituents[num_components];
|
||||
SpvId uint_type = spirv_builder_type_uint(&ctx->builder, 32);
|
||||
for (uint32_t i = 0; i < num_components; ++i)
|
||||
constituents[i] = spirv_builder_emit_composite_extract(&ctx->builder,
|
||||
uint_type,
|
||||
result, &i,
|
||||
1);
|
||||
SpvId type = get_dest_uvec_type(ctx, &intr->dest);
|
||||
unsigned num_components = nir_dest_num_components(intr->dest);
|
||||
if (num_components == 1) {
|
||||
uint32_t components[] = { 0 };
|
||||
result = spirv_builder_emit_composite_extract(&ctx->builder,
|
||||
type,
|
||||
result, components,
|
||||
1);
|
||||
} else if (num_components < 4) {
|
||||
SpvId constituents[num_components];
|
||||
SpvId uint_type = spirv_builder_type_uint(&ctx->builder, 32);
|
||||
for (uint32_t i = 0; i < num_components; ++i)
|
||||
constituents[i] = spirv_builder_emit_composite_extract(&ctx->builder,
|
||||
uint_type,
|
||||
result, &i,
|
||||
1);
|
||||
|
||||
result = spirv_builder_emit_composite_construct(&ctx->builder,
|
||||
type,
|
||||
constituents,
|
||||
num_components);
|
||||
}
|
||||
result = spirv_builder_emit_composite_construct(&ctx->builder,
|
||||
type,
|
||||
constituents,
|
||||
num_components);
|
||||
}
|
||||
|
||||
if (nir_dest_bit_size(intr->dest) == 1)
|
||||
result = uvec_to_bvec(ctx, result, num_components);
|
||||
if (nir_dest_bit_size(intr->dest) == 1)
|
||||
result = uvec_to_bvec(ctx, result, num_components);
|
||||
|
||||
store_dest(ctx, &intr->dest, result, nir_type_uint);
|
||||
} else
|
||||
unreachable("uniform-addressing not yet supported");
|
||||
store_dest(ctx, &intr->dest, result, nir_type_uint);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user