radv: add create_buffer_from_image() helper

For the special R32G32B32 paths.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset
2018-10-24 08:50:22 +02:00
parent 416abe809a
commit e60e3e1b3f

View File

@@ -1357,6 +1357,35 @@ create_bview(struct radv_cmd_buffer *cmd_buffer,
}
static void
create_buffer_from_image(struct radv_cmd_buffer *cmd_buffer,
struct radv_meta_blit2d_surf *surf,
VkBufferUsageFlagBits usage,
VkBuffer *buffer)
{
struct radv_device *device = cmd_buffer->device;
struct radv_device_memory mem = { .bo = surf->image->bo };
radv_CreateBuffer(radv_device_to_handle(device),
&(VkBufferCreateInfo) {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.flags = 0,
.size = surf->image->size,
.usage = usage,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
}, NULL, buffer);
radv_BindBufferMemory2(radv_device_to_handle(device), 1,
(VkBindBufferMemoryInfoKHR[]) {
{
.sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
.buffer = *buffer,
.memory = radv_device_memory_to_handle(&mem),
.memoryOffset = surf->image->offset,
}
});
}
static void
itob_bind_descriptors(struct radv_cmd_buffer *cmd_buffer,
struct radv_image_view *src,
@@ -1474,7 +1503,6 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer,
struct radv_meta_blit2d_rect *rects)
{
VkPipeline pipeline = cmd_buffer->device->meta_state.btoi_r32g32b32.pipeline;
struct radv_device_memory mem = { .bo = dst->image->bo };
struct radv_device *device = cmd_buffer->device;
struct radv_buffer_view src_view, dst_view;
unsigned dst_offset = 0;
@@ -1500,24 +1528,9 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer,
* image as a buffer with the same underlying memory. The compute
* shader will clear all components separately using a R32 format.
*/
radv_CreateBuffer(radv_device_to_handle(device),
&(VkBufferCreateInfo) {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.flags = 0,
.size = dst->image->size,
.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
}, NULL, &buffer);
radv_BindBufferMemory2(radv_device_to_handle(device), 1,
(VkBindBufferMemoryInfoKHR[]) {
{
.sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
.buffer = buffer,
.memory = radv_device_memory_to_handle(&mem),
.memoryOffset = dst->image->offset,
}
});
create_buffer_from_image(cmd_buffer, dst,
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,
&buffer);
create_bview(cmd_buffer, src->buffer, src->offset,
src->format, &src_view);
@@ -1750,7 +1763,6 @@ radv_meta_clear_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer,
const VkClearColorValue *clear_color)
{
VkPipeline pipeline = cmd_buffer->device->meta_state.cleari_r32g32b32.pipeline;
struct radv_device_memory mem = { .bo = dst->image->bo };
struct radv_device *device = cmd_buffer->device;
struct radv_buffer_view dst_view;
unsigned stride;
@@ -1775,24 +1787,9 @@ radv_meta_clear_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer,
* image as a buffer with the same underlying memory. The compute
* shader will clear all components separately using a R32 format.
*/
radv_CreateBuffer(radv_device_to_handle(device),
&(VkBufferCreateInfo) {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.flags = 0,
.size = dst->image->size,
.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
}, NULL, &buffer);
radv_BindBufferMemory2(radv_device_to_handle(device), 1,
(VkBindBufferMemoryInfoKHR[]) {
{
.sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
.buffer = buffer,
.memory = radv_device_memory_to_handle(&mem),
.memoryOffset = dst->image->offset,
}
});
create_buffer_from_image(cmd_buffer, dst,
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,
&buffer);
create_bview(cmd_buffer, radv_buffer_from_handle(buffer), 0, format, &dst_view);
cleari_r32g32b32_bind_descriptors(cmd_buffer, &dst_view);