anv: Use the base vk_buffer struct
This mostly gets us the vk_buffer_range() helper but may be useful in the future. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16607>
This commit is contained in:
@@ -439,7 +439,7 @@ anv_create_ahw_memory(VkDevice device_h,
|
|||||||
usage = anv_ahw_usage_from_vk_usage(image->vk.create_flags, image->vk.usage);
|
usage = anv_ahw_usage_from_vk_usage(image->vk.create_flags, image->vk.usage);
|
||||||
} else if (dedicated_info && dedicated_info->buffer) {
|
} else if (dedicated_info && dedicated_info->buffer) {
|
||||||
ANV_FROM_HANDLE(anv_buffer, buffer, dedicated_info->buffer);
|
ANV_FROM_HANDLE(anv_buffer, buffer, dedicated_info->buffer);
|
||||||
w = buffer->size;
|
w = buffer->vk.size;
|
||||||
format = AHARDWAREBUFFER_FORMAT_BLOB;
|
format = AHARDWAREBUFFER_FORMAT_BLOB;
|
||||||
usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
|
usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
|
||||||
AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
|
AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
|
||||||
|
@@ -947,7 +947,7 @@ void anv_CmdFillBuffer(
|
|||||||
struct blorp_batch batch;
|
struct blorp_batch batch;
|
||||||
anv_blorp_batch_init(cmd_buffer, &batch, 0);
|
anv_blorp_batch_init(cmd_buffer, &batch, 0);
|
||||||
|
|
||||||
fillSize = anv_buffer_get_range(dst_buffer, dstOffset, fillSize);
|
fillSize = vk_buffer_range(&dst_buffer->vk, dstOffset, fillSize);
|
||||||
|
|
||||||
/* From the Vulkan spec:
|
/* From the Vulkan spec:
|
||||||
*
|
*
|
||||||
|
@@ -1220,8 +1220,8 @@ void anv_CmdBindTransformFeedbackBuffersEXT(
|
|||||||
xfb[firstBinding + i].buffer = buffer;
|
xfb[firstBinding + i].buffer = buffer;
|
||||||
xfb[firstBinding + i].offset = pOffsets[i];
|
xfb[firstBinding + i].offset = pOffsets[i];
|
||||||
xfb[firstBinding + i].size =
|
xfb[firstBinding + i].size =
|
||||||
anv_buffer_get_range(buffer, pOffsets[i],
|
vk_buffer_range(&buffer->vk, pOffsets[i],
|
||||||
pSizes ? pSizes[i] : VK_WHOLE_SIZE);
|
pSizes ? pSizes[i] : VK_WHOLE_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1602,7 +1602,7 @@ anv_descriptor_set_write_buffer(struct anv_device *device,
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct anv_address bind_addr = anv_address_add(buffer->address, offset);
|
struct anv_address bind_addr = anv_address_add(buffer->address, offset);
|
||||||
uint64_t bind_range = anv_buffer_get_range(buffer, offset, range);
|
uint64_t bind_range = vk_buffer_range(&buffer->vk, offset, range);
|
||||||
enum anv_descriptor_data data =
|
enum anv_descriptor_data data =
|
||||||
bind_layout->type == VK_DESCRIPTOR_TYPE_MUTABLE_VALVE ?
|
bind_layout->type == VK_DESCRIPTOR_TYPE_MUTABLE_VALVE ?
|
||||||
anv_descriptor_data_for_type(device->physical, type) :
|
anv_descriptor_data_for_type(device->physical, type) :
|
||||||
|
@@ -4265,7 +4265,7 @@ anv_bind_buffer_memory(const VkBindBufferMemoryInfo *pBindInfo)
|
|||||||
|
|
||||||
if (mem) {
|
if (mem) {
|
||||||
assert(pBindInfo->memoryOffset < mem->bo->size);
|
assert(pBindInfo->memoryOffset < mem->bo->size);
|
||||||
assert(mem->bo->size - pBindInfo->memoryOffset >= buffer->size);
|
assert(mem->bo->size - pBindInfo->memoryOffset >= buffer->vk.size);
|
||||||
buffer->address = (struct anv_address) {
|
buffer->address = (struct anv_address) {
|
||||||
.bo = mem->bo,
|
.bo = mem->bo,
|
||||||
.offset = pBindInfo->memoryOffset,
|
.offset = pBindInfo->memoryOffset,
|
||||||
@@ -4440,8 +4440,8 @@ void anv_GetBufferMemoryRequirements2(
|
|||||||
ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer);
|
ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer);
|
||||||
|
|
||||||
anv_get_buffer_memory_requirements(device,
|
anv_get_buffer_memory_requirements(device,
|
||||||
buffer->size,
|
buffer->vk.size,
|
||||||
buffer->usage,
|
buffer->vk.usage,
|
||||||
pMemoryRequirements);
|
pMemoryRequirements);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4475,16 +4475,11 @@ VkResult anv_CreateBuffer(
|
|||||||
if (pCreateInfo->size > device->physical->gtt_size)
|
if (pCreateInfo->size > device->physical->gtt_size)
|
||||||
return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
||||||
|
|
||||||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
|
buffer = vk_buffer_create(&device->vk, pCreateInfo,
|
||||||
|
pAllocator, sizeof(*buffer));
|
||||||
buffer = vk_object_alloc(&device->vk, pAllocator, sizeof(*buffer),
|
|
||||||
VK_OBJECT_TYPE_BUFFER);
|
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
buffer->create_flags = pCreateInfo->flags;
|
|
||||||
buffer->size = pCreateInfo->size;
|
|
||||||
buffer->usage = pCreateInfo->usage;
|
|
||||||
buffer->address = ANV_NULL_ADDRESS;
|
buffer->address = ANV_NULL_ADDRESS;
|
||||||
|
|
||||||
*pBuffer = anv_buffer_to_handle(buffer);
|
*pBuffer = anv_buffer_to_handle(buffer);
|
||||||
@@ -4503,7 +4498,7 @@ void anv_DestroyBuffer(
|
|||||||
if (!buffer)
|
if (!buffer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vk_object_free(&device->vk, pAllocator, buffer);
|
vk_buffer_destroy(&device->vk, pAllocator, &buffer->vk);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkDeviceAddress anv_GetBufferDeviceAddress(
|
VkDeviceAddress anv_GetBufferDeviceAddress(
|
||||||
|
@@ -2743,13 +2743,13 @@ anv_CreateBufferView(VkDevice _device,
|
|||||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
VK_IMAGE_TILING_LINEAR);
|
VK_IMAGE_TILING_LINEAR);
|
||||||
const uint32_t format_bs = isl_format_get_layout(view->format)->bpb / 8;
|
const uint32_t format_bs = isl_format_get_layout(view->format)->bpb / 8;
|
||||||
view->range = anv_buffer_get_range(buffer, pCreateInfo->offset,
|
view->range = vk_buffer_range(&buffer->vk, pCreateInfo->offset,
|
||||||
pCreateInfo->range);
|
pCreateInfo->range);
|
||||||
view->range = align_down_npot_u32(view->range, format_bs);
|
view->range = align_down_npot_u32(view->range, format_bs);
|
||||||
|
|
||||||
view->address = anv_address_add(buffer->address, pCreateInfo->offset);
|
view->address = anv_address_add(buffer->address, pCreateInfo->offset);
|
||||||
|
|
||||||
if (buffer->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
|
if (buffer->vk.usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) {
|
||||||
view->surface_state = alloc_surface_state(device);
|
view->surface_state = alloc_surface_state(device);
|
||||||
|
|
||||||
anv_fill_buffer_surface_state(device, view->surface_state,
|
anv_fill_buffer_surface_state(device, view->surface_state,
|
||||||
@@ -2759,7 +2759,7 @@ anv_CreateBufferView(VkDevice _device,
|
|||||||
view->surface_state = (struct anv_state){ 0 };
|
view->surface_state = (struct anv_state){ 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer->usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
|
if (buffer->vk.usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) {
|
||||||
view->storage_surface_state = alloc_surface_state(device);
|
view->storage_surface_state = alloc_surface_state(device);
|
||||||
view->lowered_storage_surface_state = alloc_surface_state(device);
|
view->lowered_storage_surface_state = alloc_surface_state(device);
|
||||||
|
|
||||||
|
@@ -68,6 +68,7 @@
|
|||||||
#include "util/vma.h"
|
#include "util/vma.h"
|
||||||
#include "util/xmlconfig.h"
|
#include "util/xmlconfig.h"
|
||||||
#include "vk_alloc.h"
|
#include "vk_alloc.h"
|
||||||
|
#include "vk_buffer.h"
|
||||||
#include "vk_command_buffer.h"
|
#include "vk_command_buffer.h"
|
||||||
#include "vk_command_pool.h"
|
#include "vk_command_pool.h"
|
||||||
#include "vk_debug_report.h"
|
#include "vk_debug_report.h"
|
||||||
@@ -2190,31 +2191,12 @@ struct anv_pipeline_layout {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct anv_buffer {
|
struct anv_buffer {
|
||||||
struct vk_object_base base;
|
struct vk_buffer vk;
|
||||||
|
|
||||||
struct anv_device * device;
|
|
||||||
VkDeviceSize size;
|
|
||||||
|
|
||||||
VkBufferCreateFlags create_flags;
|
|
||||||
VkBufferUsageFlags usage;
|
|
||||||
|
|
||||||
/* Set when bound */
|
/* Set when bound */
|
||||||
struct anv_address address;
|
struct anv_address address;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline uint64_t
|
|
||||||
anv_buffer_get_range(struct anv_buffer *buffer, uint64_t offset, uint64_t range)
|
|
||||||
{
|
|
||||||
assert(offset <= buffer->size);
|
|
||||||
if (range == VK_WHOLE_SIZE) {
|
|
||||||
return buffer->size - offset;
|
|
||||||
} else {
|
|
||||||
assert(range + offset >= range);
|
|
||||||
assert(range + offset <= buffer->size);
|
|
||||||
return range;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enum anv_cmd_dirty_bits {
|
enum anv_cmd_dirty_bits {
|
||||||
ANV_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 0, /* VK_DYNAMIC_STATE_VIEWPORT */
|
ANV_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 0, /* VK_DYNAMIC_STATE_VIEWPORT */
|
||||||
ANV_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 1, /* VK_DYNAMIC_STATE_SCISSOR */
|
ANV_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 1, /* VK_DYNAMIC_STATE_SCISSOR */
|
||||||
@@ -4520,7 +4502,7 @@ VK_DEFINE_HANDLE_CASTS(anv_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
|
|||||||
VK_DEFINE_NONDISP_HANDLE_CASTS(anv_acceleration_structure, base,
|
VK_DEFINE_NONDISP_HANDLE_CASTS(anv_acceleration_structure, base,
|
||||||
VkAccelerationStructureKHR,
|
VkAccelerationStructureKHR,
|
||||||
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR)
|
VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR)
|
||||||
VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer, base, VkBuffer,
|
VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer, vk.base, VkBuffer,
|
||||||
VK_OBJECT_TYPE_BUFFER)
|
VK_OBJECT_TYPE_BUFFER)
|
||||||
VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer_view, base, VkBufferView,
|
VK_DEFINE_NONDISP_HANDLE_CASTS(anv_buffer_view, base, VkBufferView,
|
||||||
VK_OBJECT_TYPE_BUFFER_VIEW)
|
VK_OBJECT_TYPE_BUFFER_VIEW)
|
||||||
|
@@ -2784,9 +2784,9 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
push->dynamic_offsets[binding->dynamic_offset_index];
|
push->dynamic_offsets[binding->dynamic_offset_index];
|
||||||
uint64_t offset = desc->offset + dynamic_offset;
|
uint64_t offset = desc->offset + dynamic_offset;
|
||||||
/* Clamp to the buffer size */
|
/* Clamp to the buffer size */
|
||||||
offset = MIN2(offset, desc->buffer->size);
|
offset = MIN2(offset, desc->buffer->vk.size);
|
||||||
/* Clamp the range to the buffer size */
|
/* Clamp the range to the buffer size */
|
||||||
uint32_t range = MIN2(desc->range, desc->buffer->size - offset);
|
uint32_t range = MIN2(desc->range, desc->buffer->vk.size - offset);
|
||||||
|
|
||||||
/* Align the range for consistency */
|
/* Align the range for consistency */
|
||||||
if (desc->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)
|
if (desc->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)
|
||||||
@@ -3133,9 +3133,9 @@ get_push_range_bound_size(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
push->dynamic_offsets[range->dynamic_offset_index];
|
push->dynamic_offsets[range->dynamic_offset_index];
|
||||||
uint64_t offset = desc->offset + dynamic_offset;
|
uint64_t offset = desc->offset + dynamic_offset;
|
||||||
/* Clamp to the buffer size */
|
/* Clamp to the buffer size */
|
||||||
offset = MIN2(offset, desc->buffer->size);
|
offset = MIN2(offset, desc->buffer->vk.size);
|
||||||
/* Clamp the range to the buffer size */
|
/* Clamp the range to the buffer size */
|
||||||
uint32_t bound_range = MIN2(desc->range, desc->buffer->size - offset);
|
uint32_t bound_range = MIN2(desc->range, desc->buffer->vk.size - offset);
|
||||||
|
|
||||||
/* Align the range for consistency */
|
/* Align the range for consistency */
|
||||||
bound_range = align_u32(bound_range, ANV_UBO_ALIGNMENT);
|
bound_range = align_u32(bound_range, ANV_UBO_ALIGNMENT);
|
||||||
@@ -3843,7 +3843,7 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
* elements of pname:pBuffers[i] plus pname:pOffsets[i]."
|
* elements of pname:pBuffers[i] plus pname:pOffsets[i]."
|
||||||
*/
|
*/
|
||||||
UNUSED uint32_t size = dynamic_size ?
|
UNUSED uint32_t size = dynamic_size ?
|
||||||
cmd_buffer->state.vertex_bindings[vb].size : buffer->size - offset;
|
cmd_buffer->state.vertex_bindings[vb].size : buffer->vk.size - offset;
|
||||||
|
|
||||||
state = (struct GENX(VERTEX_BUFFER_STATE)) {
|
state = (struct GENX(VERTEX_BUFFER_STATE)) {
|
||||||
.VertexBufferIndex = vb,
|
.VertexBufferIndex = vb,
|
||||||
@@ -3857,7 +3857,7 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
.AddressModifyEnable = true,
|
.AddressModifyEnable = true,
|
||||||
.BufferPitch = stride,
|
.BufferPitch = stride,
|
||||||
.BufferStartingAddress = anv_address_add(buffer->address, offset),
|
.BufferStartingAddress = anv_address_add(buffer->address, offset),
|
||||||
.NullVertexBuffer = offset >= buffer->size,
|
.NullVertexBuffer = offset >= buffer->vk.size,
|
||||||
#if GFX_VER >= 12
|
#if GFX_VER >= 12
|
||||||
.L3BypassDisable = true,
|
.L3BypassDisable = true,
|
||||||
#endif
|
#endif
|
||||||
@@ -3870,7 +3870,7 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
*
|
*
|
||||||
* https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7439
|
* https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7439
|
||||||
*/
|
*/
|
||||||
.EndAddress = anv_address_add(buffer->address, buffer->size - 1),
|
.EndAddress = anv_address_add(buffer->address, buffer->vk.size - 1),
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
|
@@ -269,7 +269,7 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
|
|
||||||
ib.BufferStartingAddress = anv_address_add(buffer->address, offset);
|
ib.BufferStartingAddress = anv_address_add(buffer->address, offset);
|
||||||
ib.BufferEndingAddress = anv_address_add(buffer->address,
|
ib.BufferEndingAddress = anv_address_add(buffer->address,
|
||||||
buffer->size);
|
buffer->vk.size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -761,7 +761,8 @@ void genX(CmdBindIndexBuffer)(
|
|||||||
ib.L3BypassDisable = true;
|
ib.L3BypassDisable = true;
|
||||||
#endif
|
#endif
|
||||||
ib.BufferStartingAddress = anv_address_add(buffer->address, offset);
|
ib.BufferStartingAddress = anv_address_add(buffer->address, offset);
|
||||||
ib.BufferSize = buffer->size - offset;
|
ib.BufferSize = vk_buffer_range(&buffer->vk, offset,
|
||||||
|
VK_WHOLE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_INDEX_BUFFER;
|
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_INDEX_BUFFER;
|
||||||
|
Reference in New Issue
Block a user