vk: Unionize anv_desciptor
For a given struct anv_descriptor, all members are NULL (in which case the descriptor is empty) or exactly one member is non-NULL. To make struct anv_descriptor better reflect its set of valid states, convert the struct into a tagged union.
This commit is contained in:
@@ -456,12 +456,14 @@ anv_cmd_buffer_emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
||||
uint32_t start = bias + layout->set[set].stage[stage].surface_start;
|
||||
|
||||
for (uint32_t b = 0; b < set_layout->stage[stage].surface_count; b++) {
|
||||
struct anv_surface_view *view =
|
||||
d->set->descriptors[surface_slots[b].index].view;
|
||||
struct anv_descriptor *desc =
|
||||
&d->set->descriptors[surface_slots[b].index];
|
||||
|
||||
if (!view)
|
||||
if (desc->type != ANV_DESCRIPTOR_TYPE_SURFACE_VIEW)
|
||||
continue;
|
||||
|
||||
struct anv_surface_view *view = desc->surface_view;
|
||||
|
||||
bt_map[start + b] = view->surface_state.offset + state_offset;
|
||||
add_surface_state_reloc(cmd_buffer, view->surface_state,
|
||||
view->bo, view->offset);
|
||||
@@ -502,12 +504,14 @@ anv_cmd_buffer_emit_samplers(struct anv_cmd_buffer *cmd_buffer,
|
||||
uint32_t start = layout->set[set].stage[stage].sampler_start;
|
||||
|
||||
for (uint32_t b = 0; b < set_layout->stage[stage].sampler_count; b++) {
|
||||
struct anv_sampler *sampler =
|
||||
d->set->descriptors[sampler_slots[b].index].sampler;
|
||||
struct anv_descriptor *desc =
|
||||
&d->set->descriptors[sampler_slots[b].index];
|
||||
|
||||
if (!sampler)
|
||||
if (desc->type != ANV_DESCRIPTOR_TYPE_SAMPLER)
|
||||
continue;
|
||||
|
||||
struct anv_sampler *sampler = desc->sampler;
|
||||
|
||||
memcpy(state->map + (start + b) * 16,
|
||||
sampler->state, sizeof(sampler->state));
|
||||
}
|
||||
|
||||
+17
-4
@@ -1733,8 +1733,13 @@ VkResult anv_UpdateDescriptorSets(
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
||||
for (uint32_t j = 0; j < write->count; j++) {
|
||||
set->descriptors[write->destBinding + j].sampler =
|
||||
anv_sampler_from_handle(write->pDescriptors[j].sampler);
|
||||
ANV_FROM_HANDLE(anv_sampler, sampler,
|
||||
write->pDescriptors[j].sampler);
|
||||
|
||||
set->descriptors[write->destBinding + j] = (struct anv_descriptor) {
|
||||
.type = ANV_DESCRIPTOR_TYPE_SAMPLER,
|
||||
.sampler = sampler,
|
||||
};
|
||||
}
|
||||
|
||||
if (write->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER)
|
||||
@@ -1747,7 +1752,11 @@ VkResult anv_UpdateDescriptorSets(
|
||||
for (uint32_t j = 0; j < write->count; j++) {
|
||||
ANV_FROM_HANDLE(anv_image_view, iview,
|
||||
write->pDescriptors[j].imageView);
|
||||
set->descriptors[write->destBinding + j].view = &iview->view;
|
||||
|
||||
set->descriptors[write->destBinding + j] = (struct anv_descriptor) {
|
||||
.type = ANV_DESCRIPTOR_TYPE_SURFACE_VIEW,
|
||||
.surface_view = &iview->view,
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1767,7 +1776,11 @@ VkResult anv_UpdateDescriptorSets(
|
||||
for (uint32_t j = 0; j < write->count; j++) {
|
||||
ANV_FROM_HANDLE(anv_buffer_view, bview,
|
||||
write->pDescriptors[j].bufferView);
|
||||
set->descriptors[write->destBinding + j].view = &bview->view;
|
||||
|
||||
set->descriptors[write->destBinding + j] = (struct anv_descriptor) {
|
||||
.type = ANV_DESCRIPTOR_TYPE_SURFACE_VIEW,
|
||||
.surface_view = &bview->view,
|
||||
};
|
||||
}
|
||||
|
||||
default:
|
||||
|
||||
@@ -728,9 +728,19 @@ struct anv_descriptor_set_layout {
|
||||
struct anv_descriptor_slot entries[0];
|
||||
};
|
||||
|
||||
enum anv_descriptor_type {
|
||||
ANV_DESCRIPTOR_TYPE_EMPTY = 0,
|
||||
ANV_DESCRIPTOR_TYPE_SAMPLER,
|
||||
ANV_DESCRIPTOR_TYPE_SURFACE_VIEW,
|
||||
};
|
||||
|
||||
struct anv_descriptor {
|
||||
struct anv_sampler *sampler;
|
||||
struct anv_surface_view *view;
|
||||
union {
|
||||
struct anv_sampler *sampler;
|
||||
struct anv_surface_view *surface_view;
|
||||
};
|
||||
|
||||
enum anv_descriptor_type type;
|
||||
};
|
||||
|
||||
struct anv_descriptor_set {
|
||||
|
||||
Reference in New Issue
Block a user