device->instance = instance;
device->dev = ndev;
+ device->mem_heaps[0].flags = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
+ device->mem_types[0].propertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ device->mem_types[0].heapIndex = 0;
+
+ if (ndev->vram_size) {
+ device->mem_type_cnt = 2;
+ device->mem_heap_cnt = 2;
+
+ device->mem_heaps[0].size = ndev->vram_size;
+ device->mem_heaps[1].size = ndev->gart_size;
+ device->mem_heaps[1].flags = 0;
+ device->mem_types[1].heapIndex = 1;
+ device->mem_types[1].propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
+ } else {
+ device->mem_type_cnt = 1;
+ device->mem_heap_cnt = 1;
+
+ device->mem_heaps[0].size = ndev->gart_size;
+ device->mem_types[0].propertyFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
+ }
+
*device_out = device;
return VK_SUCCESS;
nvk_GetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,
VkPhysicalDeviceMemoryProperties2 *pMemoryProperties)
{
+ VK_FROM_HANDLE(nvk_physical_device, pdevice, physicalDevice);
+
+ pMemoryProperties->memoryProperties.memoryHeapCount = pdevice->mem_heap_cnt;
+ for (int i = 0; i < pdevice->mem_heap_cnt; i++) {
+ pMemoryProperties->memoryProperties.memoryHeaps[i] = pdevice->mem_heaps[i];
+ }
+
+ pMemoryProperties->memoryProperties.memoryTypeCount = pdevice->mem_type_cnt;
+ for (int i = 0; i < pdevice->mem_type_cnt; i++) {
+ pMemoryProperties->memoryProperties.memoryTypes[i] = pdevice->mem_types[i];
+ }
+
vk_foreach_struct(ext, pMemoryProperties->pNext)
{
switch (ext->sType) {
/* Link in nvk_instance::physical_devices */
struct list_head link;
+
+ // TODO: add mapable VRAM heap if possible
+ VkMemoryHeap mem_heaps[2];
+ VkMemoryType mem_types[2];
+ uint8_t mem_heap_cnt;
+ uint8_t mem_type_cnt;
};
VK_DEFINE_HANDLE_CASTS(nvk_physical_device,
#include <stddef.h>
+#include "util/os_misc.h"
+
struct nouveau_ws_device_priv {
struct nouveau_ws_device base;
struct nouveau_drm *drm;
device->base.device_id = device_id;
device->base.chipset = dev->chipset;
device->base.vram_size = dev->vram_size;
- device->base.gart_size = dev->gart_size;
+ os_get_available_system_memory(&device->base.gart_size);
+ device->base.gart_size = MIN2(device->base.gart_size, dev->gart_size);
device->base.is_integrated = dev->vram_size == 0;
device->drm = drm;
device->dev = dev;