lavapipe: refactor descriptor set binding to support push later.

This refactors the code push descriptor code so it can be reused
later for push descriptors.

Acked-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7912>
This commit is contained in:
Dave Airlie
2020-12-04 10:22:40 +10:00
committed by Marge Bot
parent fb7ccd3b23
commit e7cb57d73e
3 changed files with 48 additions and 44 deletions
@@ -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,
};
}
+24 -23
View File
@@ -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);
}
}
}
+15 -12
View File
@@ -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 {