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);
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));
}
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)
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;
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:
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 {