lavapipe: use gallium buffer descriptor types directly

this cleans up a bit of code

Reviewed-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Acked-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17740>
This commit is contained in:
Mike Blumenkrantz 2022-07-25 10:38:53 -04:00 committed by Marge Bot
parent b7b7da9769
commit 6212cff00a
3 changed files with 63 additions and 45 deletions

View file

@ -495,18 +495,32 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets(
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
desc[j] = (struct lvp_descriptor) {
.type = write->descriptorType,
.info.ubo.buffer_offset = buffer ? write->pBufferInfo[j].offset : 0,
.info.ubo.buffer = buffer ? buffer->bo : NULL,
.info.ubo.buffer_size = buffer ? write->pBufferInfo[j].range : 0,
};
if (buffer && write->pBufferInfo[j].range == VK_WHOLE_SIZE)
desc[j].info.ubo.buffer_size = buffer->bo->width0 - desc[j].info.ubo.buffer_offset;
}
break;
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
for (uint32_t j = 0; j < write->descriptorCount; j++) {
LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
desc[j] = (struct lvp_descriptor) {
.type = write->descriptorType,
.info.offset = write->pBufferInfo[j].offset,
.info.buffer = buffer,
.info.range = write->pBufferInfo[j].range,
.info.ssbo.buffer_offset = buffer ? write->pBufferInfo[j].offset : 0,
.info.ssbo.buffer = buffer ? buffer->bo : NULL,
.info.ssbo.buffer_size = buffer ? write->pBufferInfo[j].range : 0,
};
if (buffer && write->pBufferInfo[j].range == VK_WHOLE_SIZE)
desc[j].info.ssbo.buffer_size = buffer->bo->width0 - desc[j].info.ssbo.buffer_offset;
}
break;
@ -736,16 +750,32 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSetWithTemplate(VkDevice _device,
}
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: {
VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc;
LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer);
desc[idx] = (struct lvp_descriptor) {
.type = entry->descriptorType,
.info.offset = info->offset,
.info.buffer = lvp_buffer_from_handle(info->buffer),
.info.range = info->range,
.info.ubo.buffer_offset = buffer ? info->offset : 0,
.info.ubo.buffer = buffer ? buffer->bo : NULL,
.info.ubo.buffer_size = buffer ? info->range : 0,
};
if (buffer && info->range == VK_WHOLE_SIZE)
desc[idx].info.ubo.buffer_size = buffer->bo->width0 - desc[idx].info.ubo.buffer_offset;
break;
}
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc;
LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer);
desc[idx] = (struct lvp_descriptor) {
.type = entry->descriptorType,
.info.ssbo.buffer_offset = buffer ? info->offset : 0,
.info.ssbo.buffer = buffer ? buffer->bo : NULL,
.info.ssbo.buffer_size = buffer ? info->range : 0,
};
if (buffer && info->range == VK_WHOLE_SIZE)
desc[idx].info.ssbo.buffer_size = buffer->bo->width0 - desc[idx].info.ssbo.buffer_offset;
break;
}
default:

View file

@ -1291,18 +1291,7 @@ static void handle_descriptor(struct rendering_state *state,
return;
idx += array_idx;
idx += dyn_info->stage[stage].const_buffer_count;
if (!descriptor->buffer) {
state->const_buffer[p_stage][idx].buffer = NULL;
state->const_buffer[p_stage][idx].buffer_offset = 0;
state->const_buffer[p_stage][idx].buffer_size = 0;
} else {
state->const_buffer[p_stage][idx].buffer = descriptor->buffer->bo;
state->const_buffer[p_stage][idx].buffer_offset = descriptor->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->range;
}
state->const_buffer[p_stage][idx] = descriptor->ubo;
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;
@ -1320,18 +1309,7 @@ static void handle_descriptor(struct rendering_state *state,
return;
idx += array_idx;
idx += dyn_info->stage[stage].shader_buffer_count;
if (!descriptor->buffer) {
state->sb[p_stage][idx].buffer = NULL;
state->sb[p_stage][idx].buffer_offset = 0;
state->sb[p_stage][idx].buffer_size = 0;
} else {
state->sb[p_stage][idx].buffer = descriptor->buffer->bo;
state->sb[p_stage][idx].buffer_offset = descriptor->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->range;
}
state->sb[p_stage][idx] = descriptor->ssbo;
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;
@ -3314,13 +3292,26 @@ static struct lvp_cmd_push_descriptor_set *create_push_descriptor_set(struct vk_
info->buffer_view = lvp_buffer_view_from_handle(in_cmd->descriptor_writes[i].pTexelBufferView[j]);
break;
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: {
LVP_FROM_HANDLE(lvp_buffer, buffer, in_cmd->descriptor_writes[i].pBufferInfo[j].buffer);
info->ubo.buffer = buffer ? buffer->bo : NULL;
info->ubo.buffer_offset = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].offset : 0;
info->ubo.buffer_size = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].range : 0;
if (buffer && in_cmd->descriptor_writes[i].pBufferInfo[j].range == VK_WHOLE_SIZE)
info->ubo.buffer_size = info->ubo.buffer->width0 - info->ubo.buffer_offset;
break;
}
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
LVP_FROM_HANDLE(lvp_buffer, buffer, in_cmd->descriptor_writes[i].pBufferInfo[j].buffer);
info->ssbo.buffer = buffer ? buffer->bo : NULL;
info->ssbo.buffer_offset = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].offset : 0;
info->ssbo.buffer_size = buffer ? in_cmd->descriptor_writes[i].pBufferInfo[j].range : 0;
if (buffer && in_cmd->descriptor_writes[i].pBufferInfo[j].range == VK_WHOLE_SIZE)
info->ssbo.buffer_size = info->ssbo.buffer->width0 - info->ssbo.buffer_offset;
break;
}
default:
info->buffer = lvp_buffer_from_handle(in_cmd->descriptor_writes[i].pBufferInfo[j].buffer);
info->offset = in_cmd->descriptor_writes[i].pBufferInfo[j].offset;
info->range = in_cmd->descriptor_writes[i].pBufferInfo[j].range;
break;
}
}

View file

@ -331,11 +331,8 @@ union lvp_descriptor_info {
struct pipe_sampler_state *sampler;
struct lvp_image_view *iview;
};
struct {
struct lvp_buffer *buffer;
VkDeviceSize offset;
VkDeviceSize range;
};
struct pipe_shader_buffer ssbo;
struct pipe_constant_buffer ubo;
struct lvp_buffer_view *buffer_view;
uint8_t *uniform;
};