mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 02:28:10 +02:00
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:
parent
b7b7da9769
commit
6212cff00a
3 changed files with 63 additions and 45 deletions
|
|
@ -495,18 +495,32 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSets(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
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:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||||
for (uint32_t j = 0; j < write->descriptorCount; j++) {
|
for (uint32_t j = 0; j < write->descriptorCount; j++) {
|
||||||
LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
|
LVP_FROM_HANDLE(lvp_buffer, buffer, write->pBufferInfo[j].buffer);
|
||||||
desc[j] = (struct lvp_descriptor) {
|
desc[j] = (struct lvp_descriptor) {
|
||||||
.type = write->descriptorType,
|
.type = write->descriptorType,
|
||||||
.info.offset = write->pBufferInfo[j].offset,
|
.info.ssbo.buffer_offset = buffer ? write->pBufferInfo[j].offset : 0,
|
||||||
.info.buffer = buffer,
|
.info.ssbo.buffer = buffer ? buffer->bo : NULL,
|
||||||
.info.range = write->pBufferInfo[j].range,
|
.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;
|
break;
|
||||||
|
|
||||||
|
|
@ -736,16 +750,32 @@ VKAPI_ATTR void VKAPI_CALL lvp_UpdateDescriptorSetWithTemplate(VkDevice _device,
|
||||||
}
|
}
|
||||||
|
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: {
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
|
|
||||||
VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc;
|
VkDescriptorBufferInfo *info = (VkDescriptorBufferInfo *)pSrc;
|
||||||
|
LVP_FROM_HANDLE(lvp_buffer, buffer, info->buffer);
|
||||||
desc[idx] = (struct lvp_descriptor) {
|
desc[idx] = (struct lvp_descriptor) {
|
||||||
.type = entry->descriptorType,
|
.type = entry->descriptorType,
|
||||||
.info.offset = info->offset,
|
.info.ubo.buffer_offset = buffer ? info->offset : 0,
|
||||||
.info.buffer = lvp_buffer_from_handle(info->buffer),
|
.info.ubo.buffer = buffer ? buffer->bo : NULL,
|
||||||
.info.range = info->range,
|
.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;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -1291,18 +1291,7 @@ static void handle_descriptor(struct rendering_state *state,
|
||||||
return;
|
return;
|
||||||
idx += array_idx;
|
idx += array_idx;
|
||||||
idx += dyn_info->stage[stage].const_buffer_count;
|
idx += dyn_info->stage[stage].const_buffer_count;
|
||||||
if (!descriptor->buffer) {
|
state->const_buffer[p_stage][idx] = descriptor->ubo;
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (is_dynamic) {
|
if (is_dynamic) {
|
||||||
uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx];
|
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;
|
state->const_buffer[p_stage][idx].buffer_offset += offset;
|
||||||
|
|
@ -1320,18 +1309,7 @@ static void handle_descriptor(struct rendering_state *state,
|
||||||
return;
|
return;
|
||||||
idx += array_idx;
|
idx += array_idx;
|
||||||
idx += dyn_info->stage[stage].shader_buffer_count;
|
idx += dyn_info->stage[stage].shader_buffer_count;
|
||||||
if (!descriptor->buffer) {
|
state->sb[p_stage][idx] = descriptor->ssbo;
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (is_dynamic) {
|
if (is_dynamic) {
|
||||||
uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx];
|
uint32_t offset = dyn_info->dynamic_offsets[dyn_info->dyn_index + binding->dynamic_index + array_idx];
|
||||||
state->sb[p_stage][idx].buffer_offset += offset;
|
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]);
|
info->buffer_view = lvp_buffer_view_from_handle(in_cmd->descriptor_writes[i].pTexelBufferView[j]);
|
||||||
break;
|
break;
|
||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
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_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:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -331,11 +331,8 @@ union lvp_descriptor_info {
|
||||||
struct pipe_sampler_state *sampler;
|
struct pipe_sampler_state *sampler;
|
||||||
struct lvp_image_view *iview;
|
struct lvp_image_view *iview;
|
||||||
};
|
};
|
||||||
struct {
|
struct pipe_shader_buffer ssbo;
|
||||||
struct lvp_buffer *buffer;
|
struct pipe_constant_buffer ubo;
|
||||||
VkDeviceSize offset;
|
|
||||||
VkDeviceSize range;
|
|
||||||
};
|
|
||||||
struct lvp_buffer_view *buffer_view;
|
struct lvp_buffer_view *buffer_view;
|
||||||
uint8_t *uniform;
|
uint8_t *uniform;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue