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:
@@ -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,
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user