diff options
| author | Ian Elliott <ian@LunarG.com> | 2015-04-16 11:57:46 -0600 |
|---|---|---|
| committer | Ian Elliott <ian@LunarG.com> | 2015-04-17 13:51:07 -0600 |
| commit | e30771ad395f1f78406ea7be25063ba9d5791920 (patch) | |
| tree | dbf49a359976f92d4d3560c6b0043eef68bb064e | |
| parent | cbb564e8af81feaa77701b73778c47648d50843f (diff) | |
| download | usermoji-e30771ad395f1f78406ea7be25063ba9d5791920.tar.xz | |
nulldrv: capable of running "cube"
The nulldrv has been broken for a long time. This commit enhances it enough to
run the "cube" demo. The 2 major categories of changes are:
- Add a simple, mostly-complete implementation of vkGetGpuInfo() (minus the new
WSI query).
- Add a simple implementation of vkGetFormatInfo().
- Add implementations of the new WSI entrypoints:
- vkGetDisplayInfoWSI()
- vkCreateSwapChainWSI()
- vkDestroySwapChainWSI()
- vkGetSwapChainInfoWSI()
- vkQueuePresentWSI()
- Later, other header-file-driven changes were made, including:
- Support vkGetGlobalExtensionInfo()
| -rw-r--r-- | icd/nulldrv/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | icd/nulldrv/VK_nulldrv.def | 1 | ||||
| -rw-r--r-- | icd/nulldrv/nulldrv.c | 239 | ||||
| -rw-r--r-- | icd/nulldrv/nulldrv.h | 5 |
4 files changed, 243 insertions, 6 deletions
diff --git a/icd/nulldrv/CMakeLists.txt b/icd/nulldrv/CMakeLists.txt index 6f354f6b..6640bee4 100644 --- a/icd/nulldrv/CMakeLists.txt +++ b/icd/nulldrv/CMakeLists.txt @@ -1,6 +1,10 @@ # Create the nulldrv Vulkan DRI library +if (WIN32) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES -D_CRT_SECURE_NO_WARNINGS") +else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES") +endif() add_custom_command(OUTPUT nulldrv_gpa.c COMMAND ${PYTHON_CMD} ${PROJECT_SOURCE_DIR}/vk-generate.py icd-get-proc-addr > nulldrv_gpa.c diff --git a/icd/nulldrv/VK_nulldrv.def b/icd/nulldrv/VK_nulldrv.def index ea31f6db..8c3fb262 100644 --- a/icd/nulldrv/VK_nulldrv.def +++ b/icd/nulldrv/VK_nulldrv.def @@ -29,6 +29,7 @@ EXPORTS vkGetProcAddr vkCreateInstance vkDestroyInstance + vkEnumeratePhysicalDevices vkGetGlobalExtensionInfo xcbCreateWindow xcbDestroyWindow diff --git a/icd/nulldrv/nulldrv.c b/icd/nulldrv/nulldrv.c index f63e9f60..baa8ac17 100644 --- a/icd/nulldrv/nulldrv.c +++ b/icd/nulldrv/nulldrv.c @@ -854,6 +854,150 @@ ICD_EXPORT void VKAPI vkCmdDbgMarkerEnd( NULLDRV_LOG_FUNC; } +static const VkFormat nulldrv_presentable_formats[] = { + VK_FORMAT_B8G8R8A8_UNORM, +}; + +ICD_EXPORT VkResult VKAPI vkGetDisplayInfoWSI( + VkDisplayWSI display, + VkDisplayInfoTypeWSI infoType, + size_t* pDataSize, + void* pData) +{ + VkResult ret = VK_SUCCESS; + + NULLDRV_LOG_FUNC; + + if (!pDataSize) + return VK_ERROR_INVALID_POINTER; + + switch (infoType) { + case VK_DISPLAY_INFO_TYPE_FORMAT_PROPERTIES_WSI: + { + VkDisplayFormatPropertiesWSI *dst = pData; + size_t size_ret; + uint32_t i; + + size_ret = sizeof(*dst) * ARRAY_SIZE(nulldrv_presentable_formats); + + if (dst && *pDataSize < size_ret) + return VK_ERROR_INVALID_VALUE; + + *pDataSize = size_ret; + if (!dst) + return VK_SUCCESS; + + for (i = 0; i < ARRAY_SIZE(nulldrv_presentable_formats); i++) + dst[i].swapChainFormat = nulldrv_presentable_formats[i]; + } + break; + default: + ret = VK_ERROR_INVALID_VALUE; + break; + } + + return ret; +} + +ICD_EXPORT VkResult VKAPI vkCreateSwapChainWSI( + VkDevice device, + const VkSwapChainCreateInfoWSI* pCreateInfo, + VkSwapChainWSI* pSwapChain) +{ + NULLDRV_LOG_FUNC; + struct nulldrv_dev *dev = nulldrv_dev(device); + struct nulldrv_swap_chain *sc; + + sc = (struct nulldrv_swap_chain *) nulldrv_base_create(dev, sizeof(*sc), + /*VK_OBJECT_TYPE_SWAP_CHAIN_WSI*//* FIXME: DELETE THIS HACK: */VK_DBG_OBJECT_QUEUE); + if (!sc) { + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + sc->dev = dev; + + *pSwapChain = (VkSwapChainWSI *) sc; + + return VK_SUCCESS; +} + +ICD_EXPORT VkResult VKAPI vkDestroySwapChainWSI( + VkSwapChainWSI swapChain) +{ + NULLDRV_LOG_FUNC; + struct nulldrv_swap_chain *sc = (struct nulldrv_swap_chain *) swapChain; + + free(sc); + + return VK_SUCCESS; +} + +ICD_EXPORT VkResult VKAPI vkGetSwapChainInfoWSI( + VkSwapChainWSI swapChain, + VkSwapChainInfoTypeWSI infoType, + size_t* pDataSize, + void* pData) +{ + NULLDRV_LOG_FUNC; + struct nulldrv_swap_chain *sc = (struct nulldrv_swap_chain *) swapChain; + struct nulldrv_dev *dev = sc->dev; + VkResult ret = VK_SUCCESS; + + if (!pDataSize) + return VK_ERROR_INVALID_POINTER; + + switch (infoType) { + case VK_SWAP_CHAIN_INFO_TYPE_PERSISTENT_IMAGES_WSI: + { + VkSwapChainImageInfoWSI *images; + const size_t size = sizeof(*images) * 2; + uint32_t i; + + if (pData && *pDataSize < size) + return VK_ERROR_INVALID_VALUE; + + *pDataSize = size; + if (!pData) + return VK_SUCCESS; + + images = (VkSwapChainImageInfoWSI *) pData; + for (i = 0; i < 2; i++) { + struct nulldrv_img *img; + struct nulldrv_mem *mem; + + img = (struct nulldrv_img *) nulldrv_base_create(dev, + sizeof(*img), + VK_DBG_OBJECT_IMAGE); + if (!img) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + mem = (struct nulldrv_mem *) nulldrv_base_create(dev, + sizeof(*mem), + VK_DBG_OBJECT_GPU_MEMORY); + if (!mem) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + images[i].image = (VkImage) img; + images[i].memory = (VkDeviceMemory) mem; + } + } + break; + default: + ret = VK_ERROR_INVALID_VALUE; + break; + } + + return ret; +} + +ICD_EXPORT VkResult VKAPI vkQueuePresentWSI( + VkQueue queue_, + const VkPresentInfoWSI* pPresentInfo) +{ + NULLDRV_LOG_FUNC; + + return VK_SUCCESS; +} + ICD_EXPORT void VKAPI vkCmdCopyBuffer( VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, @@ -1306,7 +1450,24 @@ ICD_EXPORT VkResult VKAPI vkGetFormatInfo( void* pData) { NULLDRV_LOG_FUNC; - return VK_SUCCESS; + struct nulldrv_dev *dev = nulldrv_dev(device); + VkFormatProperties *fmt = (VkFormatProperties *) pData; + VkResult ret = VK_SUCCESS; + + switch (infoType) { + case VK_FORMAT_INFO_TYPE_PROPERTIES: + *pDataSize = sizeof(VkFormatProperties); + if (pData == NULL) + return ret; + fmt->linearTilingFeatures = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; + fmt->optimalTilingFeatures = fmt->linearTilingFeatures; + break; + default: + ret = VK_ERROR_INVALID_VALUE; + break; + } + + return ret; } ICD_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo( @@ -1316,7 +1477,67 @@ ICD_EXPORT VkResult VKAPI vkGetPhysicalDeviceInfo( void* pData) { NULLDRV_LOG_FUNC; - return VK_SUCCESS; + struct nulldrv_gpu *gpu = nulldrv_gpu(gpu_); + VkResult ret = VK_SUCCESS; + + switch (infoType) { + case VK_PHYSICAL_DEVICE_INFO_TYPE_PROPERTIES: + { + VkPhysicalDeviceProperties *props = + (VkPhysicalDeviceProperties *) pData; + *pDataSize = sizeof(VkPhysicalDeviceProperties); + if (pData == NULL) { + return ret; + } + props->apiVersion = VK_API_VERSION; + props->driverVersion = 0; // Appropriate that the nulldrv have 0's + props->vendorId = 0; + props->deviceId = 0; + props->deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER; + strncpy(props->deviceName, "nulldrv", strlen("nulldrv")); + props->maxInlineMemoryUpdateSize = 0; + props->maxBoundDescriptorSets = 0; + props->maxThreadGroupSize = 0; + props->timestampFrequency = 0; + props->multiColorAttachmentClears = false; + break; + } + case VK_PHYSICAL_DEVICE_INFO_TYPE_PERFORMANCE: + { + VkPhysicalDevicePerformance *perf = + (VkPhysicalDevicePerformance *) pData; + *pDataSize = sizeof(VkPhysicalDevicePerformance); + if (pData == NULL) { + return ret; + } + perf->maxDeviceClock = 1.0f; + perf->aluPerClock = 1.0f; + perf->texPerClock = 1.0f; + perf->primsPerClock = 1.0f; + perf->pixelsPerClock = 1.0f; + break; + } + case VK_PHYSICAL_DEVICE_INFO_TYPE_QUEUE_PROPERTIES: + { + VkPhysicalDeviceQueueProperties *props = + (VkPhysicalDeviceQueueProperties *) pData; + *pDataSize = sizeof(VkPhysicalDeviceQueueProperties); + if (pData == NULL) { + return ret; + } + props->queueFlags = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_MEMMGR_BIT; + props->queueCount = 1; + props->maxAtomicCounters = 1; + props->supportsTimestamps = false; + props->maxMemReferences = 1; + break; + } + default: +/* FIXME: WRITE THE REAL CODE*/return ret; + break; + } + + return ret; } ICD_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( @@ -1325,6 +1546,7 @@ ICD_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( size_t* pDataSize, void* pData) { + VkExtensionProperties *ext_props; uint32_t *count; if (pDataSize == NULL) @@ -1336,14 +1558,19 @@ ICD_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( if (pData == NULL) return VK_SUCCESS; count = (uint32_t *) pData; - *count = 0; + *count = 1; break; case VK_EXTENSION_INFO_TYPE_PROPERTIES: - *pDataSize = 0; + *pDataSize = sizeof(VkExtensionProperties); if (pData == NULL) return VK_SUCCESS; - else - return VK_ERROR_INVALID_EXTENSION; + else { + ext_props = (VkExtensionProperties *) pData; + ext_props->version = VK_WSI_LUNARG_REVISION; + strncpy(ext_props->extName, "VK_WSI_LunarG", + strlen("VK_WSI_LunarG")+1); + return VK_SUCCESS; + } break; default: return VK_ERROR_INVALID_VALUE; diff --git a/icd/nulldrv/nulldrv.h b/icd/nulldrv/nulldrv.h index ef076adc..e40ada30 100644 --- a/icd/nulldrv/nulldrv.h +++ b/icd/nulldrv/nulldrv.h @@ -200,4 +200,9 @@ struct nulldrv_buf_view { uint32_t cmd_len; }; +struct nulldrv_swap_chain { + struct nulldrv_base base; + struct nulldrv_dev *dev; +}; + #endif /* NULLDRV_H */ |
