anv: Add valid_bufer_usage to the memory type metadata
Instead of returning valid types as just a number, we now walk the list and check the buffer's usage against the usage flags we store in the new anv_memory_type structure. Currently, valid_buffer_usage == ~0. Reviewed-by: Nanley Chery <nanley.g.chery@intel.com> Cc: "17.1" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -117,12 +117,13 @@ anv_physical_device_init_heaps(struct anv_physical_device *device, int fd)
|
|||||||
* both cached and coherent at the same time.
|
* both cached and coherent at the same time.
|
||||||
*/
|
*/
|
||||||
device->memory.type_count = 1;
|
device->memory.type_count = 1;
|
||||||
device->memory.types[0] = (VkMemoryType) {
|
device->memory.types[0] = (struct anv_memory_type) {
|
||||||
.propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
.propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
|
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
|
VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
|
||||||
.heapIndex = 0,
|
.heapIndex = 0,
|
||||||
|
.valid_buffer_usage = ~0,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
/* The spec requires that we expose a host-visible, coherent memory
|
/* The spec requires that we expose a host-visible, coherent memory
|
||||||
@@ -131,17 +132,19 @@ anv_physical_device_init_heaps(struct anv_physical_device *device, int fd)
|
|||||||
* coherent but uncached (WC though).
|
* coherent but uncached (WC though).
|
||||||
*/
|
*/
|
||||||
device->memory.type_count = 2;
|
device->memory.type_count = 2;
|
||||||
device->memory.types[0] = (VkMemoryType) {
|
device->memory.types[0] = (struct anv_memory_type) {
|
||||||
.propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
.propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
|
||||||
.heapIndex = 0,
|
.heapIndex = 0,
|
||||||
|
.valid_buffer_usage = ~0,
|
||||||
};
|
};
|
||||||
device->memory.types[1] = (VkMemoryType) {
|
device->memory.types[1] = (struct anv_memory_type) {
|
||||||
.propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
.propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
||||||
VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
|
VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
|
||||||
.heapIndex = 0,
|
.heapIndex = 0,
|
||||||
|
.valid_buffer_usage = ~0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1727,6 +1730,7 @@ void anv_GetBufferMemoryRequirements(
|
|||||||
{
|
{
|
||||||
ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
|
ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
|
||||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||||
|
struct anv_physical_device *pdevice = &device->instance->physicalDevice;
|
||||||
|
|
||||||
/* The Vulkan spec (git aaed022) says:
|
/* The Vulkan spec (git aaed022) says:
|
||||||
*
|
*
|
||||||
@@ -1734,13 +1738,17 @@ void anv_GetBufferMemoryRequirements(
|
|||||||
* supported memory type for the resource. The bit `1<<i` is set if and
|
* supported memory type for the resource. The bit `1<<i` is set if and
|
||||||
* only if the memory type `i` in the VkPhysicalDeviceMemoryProperties
|
* only if the memory type `i` in the VkPhysicalDeviceMemoryProperties
|
||||||
* structure for the physical device is supported.
|
* structure for the physical device is supported.
|
||||||
*
|
|
||||||
* We support exactly one memory type on LLC, two on non-LLC.
|
|
||||||
*/
|
*/
|
||||||
pMemoryRequirements->memoryTypeBits = device->info.has_llc ? 1 : 3;
|
uint32_t memory_types = 0;
|
||||||
|
for (uint32_t i = 0; i < pdevice->memory.type_count; i++) {
|
||||||
|
uint32_t valid_usage = pdevice->memory.types[i].valid_buffer_usage;
|
||||||
|
if ((valid_usage & buffer->usage) == buffer->usage)
|
||||||
|
memory_types |= (1u << i);
|
||||||
|
}
|
||||||
|
|
||||||
pMemoryRequirements->size = buffer->size;
|
pMemoryRequirements->size = buffer->size;
|
||||||
pMemoryRequirements->alignment = 16;
|
pMemoryRequirements->alignment = 16;
|
||||||
|
pMemoryRequirements->memoryTypeBits = memory_types;
|
||||||
}
|
}
|
||||||
|
|
||||||
void anv_GetImageMemoryRequirements(
|
void anv_GetImageMemoryRequirements(
|
||||||
@@ -1793,6 +1801,7 @@ VkResult anv_BindBufferMemory(
|
|||||||
ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
|
ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
|
||||||
|
|
||||||
if (mem) {
|
if (mem) {
|
||||||
|
assert((buffer->usage & mem->type->valid_buffer_usage) == buffer->usage);
|
||||||
buffer->bo = mem->bo;
|
buffer->bo = mem->bo;
|
||||||
buffer->offset = memoryOffset;
|
buffer->offset = memoryOffset;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -640,6 +640,15 @@ void anv_bo_cache_release(struct anv_device *device,
|
|||||||
struct anv_bo_cache *cache,
|
struct anv_bo_cache *cache,
|
||||||
struct anv_bo *bo);
|
struct anv_bo *bo);
|
||||||
|
|
||||||
|
struct anv_memory_type {
|
||||||
|
/* Standard bits passed on to the client */
|
||||||
|
VkMemoryPropertyFlags propertyFlags;
|
||||||
|
uint32_t heapIndex;
|
||||||
|
|
||||||
|
/* Driver-internal book-keeping */
|
||||||
|
VkBufferUsageFlags valid_buffer_usage;
|
||||||
|
};
|
||||||
|
|
||||||
struct anv_physical_device {
|
struct anv_physical_device {
|
||||||
VK_LOADER_DATA _loader_data;
|
VK_LOADER_DATA _loader_data;
|
||||||
|
|
||||||
@@ -667,7 +676,7 @@ struct anv_physical_device {
|
|||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t type_count;
|
uint32_t type_count;
|
||||||
VkMemoryType types[VK_MAX_MEMORY_TYPES];
|
struct anv_memory_type types[VK_MAX_MEMORY_TYPES];
|
||||||
uint32_t heap_count;
|
uint32_t heap_count;
|
||||||
VkMemoryHeap heaps[VK_MAX_MEMORY_HEAPS];
|
VkMemoryHeap heaps[VK_MAX_MEMORY_HEAPS];
|
||||||
} memory;
|
} memory;
|
||||||
@@ -1002,7 +1011,7 @@ _anv_combine_address(struct anv_batch *batch, void *location,
|
|||||||
|
|
||||||
struct anv_device_memory {
|
struct anv_device_memory {
|
||||||
struct anv_bo * bo;
|
struct anv_bo * bo;
|
||||||
VkMemoryType * type;
|
struct anv_memory_type * type;
|
||||||
VkDeviceSize map_size;
|
VkDeviceSize map_size;
|
||||||
void * map;
|
void * map;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user