aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Elliott <ian@LunarG.com>2015-04-16 11:57:46 -0600
committerIan Elliott <ian@LunarG.com>2015-04-17 13:51:07 -0600
commite30771ad395f1f78406ea7be25063ba9d5791920 (patch)
treedbf49a359976f92d4d3560c6b0043eef68bb064e
parentcbb564e8af81feaa77701b73778c47648d50843f (diff)
downloadusermoji-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.txt4
-rw-r--r--icd/nulldrv/VK_nulldrv.def1
-rw-r--r--icd/nulldrv/nulldrv.c239
-rw-r--r--icd/nulldrv/nulldrv.h5
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 */