nir/spirv: Handle the WorkgroupSize builtin decoration
This fixes the 7 dEQP-VK.pipeline.spec_constant.compute.local_size.* tests in the latest dev version of the Vulkan CTS. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Cc: "12.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -931,6 +931,25 @@ get_specialization(struct vtn_builder *b, struct vtn_value *val,
|
||||
return const_value;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_workgroup_size_decoration_cb(struct vtn_builder *b,
|
||||
struct vtn_value *val,
|
||||
int member,
|
||||
const struct vtn_decoration *dec,
|
||||
void *data)
|
||||
{
|
||||
assert(member == -1);
|
||||
if (dec->decoration != SpvDecorationBuiltIn ||
|
||||
dec->literals[0] != SpvBuiltInWorkgroupSize)
|
||||
return;
|
||||
|
||||
assert(val->const_type == glsl_vector_type(GLSL_TYPE_UINT, 3));
|
||||
|
||||
b->shader->info.cs.local_size[0] = val->constant->value.u[0];
|
||||
b->shader->info.cs.local_size[1] = val->constant->value.u[1];
|
||||
b->shader->info.cs.local_size[2] = val->constant->value.u[2];
|
||||
}
|
||||
|
||||
static void
|
||||
vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
|
||||
const uint32_t *w, unsigned count)
|
||||
@@ -1151,6 +1170,9 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
|
||||
default:
|
||||
unreachable("Unhandled opcode");
|
||||
}
|
||||
|
||||
/* Now that we have the value, update the workgroup size if needed */
|
||||
vtn_foreach_decoration(b, val, handle_workgroup_size_decoration_cb, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user