diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c index 68c6a8df42b..a7c8589cf59 100644 --- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c +++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c @@ -249,7 +249,7 @@ lvp_descriptor_set_create(struct lvp_device *device, for (uint32_t b = 0; b < layout->binding_count; b++) { if (layout->binding[b].immutable_samplers) { for (uint32_t i = 0; i < layout->binding[b].array_size; i++) - desc[i].sampler = layout->binding[b].immutable_samplers[i]; + desc[i].info.sampler = layout->binding[b].immutable_samplers[i]; } desc += layout->binding[b].array_size; } @@ -339,7 +339,7 @@ void lvp_UpdateDescriptorSets( desc[j] = (struct lvp_descriptor) { .type = VK_DESCRIPTOR_TYPE_SAMPLER, - .sampler = sampler, + .info.sampler = sampler, }; } break; @@ -352,13 +352,13 @@ void lvp_UpdateDescriptorSets( write->pImageInfo[j].sampler); desc[j].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - desc[j].image_view = iview; + desc[j].info.iview = iview; /* If this descriptor has an immutable sampler, we don't want * to stomp on it. */ if (sampler) - desc[j].sampler = sampler; + desc[j].info.sampler = sampler; } break; @@ -371,7 +371,7 @@ void lvp_UpdateDescriptorSets( desc[j] = (struct lvp_descriptor) { .type = write->descriptorType, - .image_view = iview, + .info.iview = iview, }; } break; @@ -384,7 +384,7 @@ void lvp_UpdateDescriptorSets( desc[j] = (struct lvp_descriptor) { .type = write->descriptorType, - .buffer_view = bview, + .info.buffer_view = bview, }; } break; @@ -399,9 +399,9 @@ void lvp_UpdateDescriptorSets( assert(buffer); desc[j] = (struct lvp_descriptor) { .type = write->descriptorType, - .buf.offset = write->pBufferInfo[j].offset, - .buf.buffer = buffer, - .buf.range = write->pBufferInfo[j].range, + .info.offset = write->pBufferInfo[j].offset, + .info.buffer = buffer, + .info.range = write->pBufferInfo[j].range, }; } diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 342e53b3804..100642ffd2d 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -744,7 +744,7 @@ static void fill_sampler_stage(struct rendering_state *state, gl_shader_stage stage, enum pipe_shader_type p_stage, int array_idx, - const struct lvp_descriptor *descriptor, + const union lvp_descriptor_info *descriptor, const struct lvp_descriptor_set_binding_layout *binding) { int ss_idx = binding->stage[stage].sampler_index; @@ -763,7 +763,7 @@ static void fill_sampler_view_stage(struct rendering_state *state, gl_shader_stage stage, enum pipe_shader_type p_stage, int array_idx, - const struct lvp_descriptor *descriptor, + const union lvp_descriptor_info *descriptor, const struct lvp_descriptor_set_binding_layout *binding) { int sv_idx = binding->stage[stage].sampler_view_index; @@ -771,7 +771,7 @@ static void fill_sampler_view_stage(struct rendering_state *state, return; sv_idx += array_idx; sv_idx += dyn_info->stage[stage].sampler_view_count; - struct lvp_image_view *iv = descriptor->image_view; + struct lvp_image_view *iv = descriptor->iview; struct pipe_sampler_view templ; enum pipe_format pformat; @@ -822,7 +822,7 @@ static void fill_sampler_buffer_view_stage(struct rendering_state *state, gl_shader_stage stage, enum pipe_shader_type p_stage, int array_idx, - const struct lvp_descriptor *descriptor, + const union lvp_descriptor_info *descriptor, const struct lvp_descriptor_set_binding_layout *binding) { int sv_idx = binding->stage[stage].sampler_view_index; @@ -857,10 +857,10 @@ static void fill_image_view_stage(struct rendering_state *state, gl_shader_stage stage, enum pipe_shader_type p_stage, int array_idx, - const struct lvp_descriptor *descriptor, + const union lvp_descriptor_info *descriptor, const struct lvp_descriptor_set_binding_layout *binding) { - struct lvp_image_view *iv = descriptor->image_view; + struct lvp_image_view *iv = descriptor->iview; int idx = binding->stage[stage].image_index; if (idx == -1) return; @@ -892,7 +892,7 @@ static void fill_image_buffer_view_stage(struct rendering_state *state, gl_shader_stage stage, enum pipe_shader_type p_stage, int array_idx, - const struct lvp_descriptor *descriptor, + const union lvp_descriptor_info *descriptor, const struct lvp_descriptor_set_binding_layout *binding) { struct lvp_buffer_view *bv = descriptor->buffer_view; @@ -916,12 +916,13 @@ static void handle_descriptor(struct rendering_state *state, gl_shader_stage stage, enum pipe_shader_type p_stage, int array_idx, - const struct lvp_descriptor *descriptor) + VkDescriptorType type, + const union lvp_descriptor_info *descriptor) { - bool is_dynamic = descriptor->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC || - descriptor->type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; + bool is_dynamic = type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC || + type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC; - switch (descriptor->type) { + switch (type) { case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { fill_image_view_stage(state, dyn_info, stage, p_stage, array_idx, descriptor, binding); @@ -934,16 +935,16 @@ static void handle_descriptor(struct rendering_state *state, return; idx += array_idx; idx += dyn_info->stage[stage].const_buffer_count; - state->const_buffer[p_stage][idx].buffer = descriptor->buf.buffer->bo; - state->const_buffer[p_stage][idx].buffer_offset = descriptor->buf.offset + descriptor->buf.buffer->offset; + state->const_buffer[p_stage][idx].buffer = descriptor->buffer->bo; + state->const_buffer[p_stage][idx].buffer_offset = descriptor->offset + descriptor->buffer->offset; if (is_dynamic) { uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx]; state->const_buffer[p_stage][idx].buffer_offset += offset; } - if (descriptor->buf.range == VK_WHOLE_SIZE) - state->const_buffer[p_stage][idx].buffer_size = descriptor->buf.buffer->bo->width0 - state->const_buffer[p_stage][idx].buffer_offset; + if (descriptor->range == VK_WHOLE_SIZE) + state->const_buffer[p_stage][idx].buffer_size = descriptor->buffer->bo->width0 - state->const_buffer[p_stage][idx].buffer_offset; else - state->const_buffer[p_stage][idx].buffer_size = descriptor->buf.range; + state->const_buffer[p_stage][idx].buffer_size = descriptor->range; if (state->num_const_bufs[p_stage] <= idx) state->num_const_bufs[p_stage] = idx + 1; state->constbuf_dirty[p_stage] = true; @@ -956,16 +957,16 @@ static void handle_descriptor(struct rendering_state *state, return; idx += array_idx; idx += dyn_info->stage[stage].shader_buffer_count; - state->sb[p_stage][idx].buffer = descriptor->buf.buffer->bo; - state->sb[p_stage][idx].buffer_offset = descriptor->buf.offset + descriptor->buf.buffer->offset; + state->sb[p_stage][idx].buffer = descriptor->buffer->bo; + state->sb[p_stage][idx].buffer_offset = descriptor->offset + descriptor->buffer->offset; if (is_dynamic) { uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx]; state->sb[p_stage][idx].buffer_offset += offset; } - if (descriptor->buf.range == VK_WHOLE_SIZE) - state->sb[p_stage][idx].buffer_size = descriptor->buf.buffer->bo->width0 - state->sb[p_stage][idx].buffer_offset; + if (descriptor->range == VK_WHOLE_SIZE) + state->sb[p_stage][idx].buffer_size = descriptor->buffer->bo->width0 - state->sb[p_stage][idx].buffer_offset; else - state->sb[p_stage][idx].buffer_size = descriptor->buf.range; + state->sb[p_stage][idx].buffer_size = descriptor->range; if (state->num_shader_buffers[p_stage] <= idx) state->num_shader_buffers[p_stage] = idx + 1; state->sb_dirty[p_stage] = true; @@ -990,7 +991,7 @@ static void handle_descriptor(struct rendering_state *state, fill_image_buffer_view_stage(state, dyn_info, stage, p_stage, array_idx, descriptor, binding); break; default: - fprintf(stderr, "Unhandled descriptor set %d\n", descriptor->type); + fprintf(stderr, "Unhandled descriptor set %d\n", type); break; } } @@ -1010,7 +1011,7 @@ static void handle_set_stage(struct rendering_state *state, if (binding->valid) { for (int i = 0; i < binding->array_size; i++) { descriptor = &set->descriptors[binding->descriptor_index + i]; - handle_descriptor(state, dyn_info, binding, stage, p_stage, i, descriptor); + handle_descriptor(state, dyn_info, binding, stage, p_stage, i, descriptor->type, &descriptor->info); } } } diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index b629484fd68..b21cfba425f 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -449,21 +449,24 @@ struct lvp_descriptor_set_layout { struct lvp_descriptor_set_binding_layout binding[0]; }; +union lvp_descriptor_info { + struct { + struct lvp_sampler *sampler; + struct lvp_image_view *iview; + VkImageLayout image_layout; + }; + struct { + struct lvp_buffer *buffer; + VkDeviceSize offset; + VkDeviceSize range; + }; + struct lvp_buffer_view *buffer_view; +}; + struct lvp_descriptor { VkDescriptorType type; - union { - struct { - struct lvp_image_view *image_view; - struct lvp_sampler *sampler; - }; - struct { - uint64_t offset; - uint64_t range; - struct lvp_buffer *buffer; - } buf; - struct lvp_buffer_view *buffer_view; - }; + union lvp_descriptor_info info; }; struct lvp_descriptor_set {