1 /*-------------------------------------------------------------------------
5 * Copyright (c) 2015 Google Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Null (dummy) Vulkan implementation.
22 *//*--------------------------------------------------------------------*/
24 #include "vkNullDriver.hpp"
25 #include "vkPlatform.hpp"
26 #include "vkImageUtil.hpp"
27 #include "tcuFunctionLibrary.hpp"
44 void* allocateSystemMem (const VkAllocationCallbacks* pAllocator, VkSystemAllocationScope scope)
46 void* ptr = pAllocator->pfnAllocation(pAllocator->pUserData, sizeof(T), sizeof(void*), scope);
48 throw std::bad_alloc();
52 void freeSystemMem (const VkAllocationCallbacks* pAllocator, void* mem)
54 pAllocator->pfnFree(pAllocator->pUserData, mem);
57 template<typename Object, typename Handle, typename Parent, typename CreateInfo>
58 Handle allocateHandle (Parent parent, const CreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator)
60 Object* obj = DE_NULL;
64 void* mem = allocateSystemMem<Object>(pAllocator, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
67 obj = new (mem) Object(parent, pCreateInfo);
68 DE_ASSERT(obj == mem);
72 pAllocator->pfnFree(pAllocator->pUserData, mem);
77 obj = new Object(parent, pCreateInfo);
79 return reinterpret_cast<Handle>(obj);
82 template<typename Object, typename Handle, typename CreateInfo>
83 Handle allocateHandle (const CreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator)
85 Object* obj = DE_NULL;
89 void* mem = allocateSystemMem<Object>(pAllocator, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
92 obj = new (mem) Object(pCreateInfo);
93 DE_ASSERT(obj == mem);
97 pAllocator->pfnFree(pAllocator->pUserData, mem);
102 obj = new Object(pCreateInfo);
104 return reinterpret_cast<Handle>(obj);
107 template<typename Object, typename Handle>
108 void freeHandle (Handle handle, const VkAllocationCallbacks* pAllocator)
110 Object* obj = reinterpret_cast<Object*>(handle);
115 freeSystemMem(pAllocator, reinterpret_cast<void*>(obj));
121 template<typename Object, typename Handle, typename Parent, typename CreateInfo>
122 Handle allocateNonDispHandle (Parent parent, const CreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator)
124 Object* const obj = allocateHandle<Object, Object*>(parent, pCreateInfo, pAllocator);
125 return Handle((deUint64)(deUintptr)obj);
128 template<typename Object, typename Handle>
129 void freeNonDispHandle (Handle handle, const VkAllocationCallbacks* pAllocator)
131 freeHandle<Object>(reinterpret_cast<Object*>((deUintptr)handle.getInternal()), pAllocator);
134 // Object definitions
136 #define VK_NULL_RETURN(STMT) \
141 } catch (const std::bad_alloc&) { \
142 return VK_ERROR_OUT_OF_HOST_MEMORY; \
143 } catch (VkResult res) { \
146 } while (deGetFalse())
148 // \todo [2015-07-14 pyry] Check FUNC type by checkedCastToPtr<T>() or similar
149 #define VK_NULL_FUNC_ENTRY(NAME, FUNC) { #NAME, (deFunctionPtr)FUNC } // NOLINT(FUNC)
151 #define VK_NULL_DEFINE_DEVICE_OBJ(NAME) \
154 NAME (VkDevice, const Vk##NAME##CreateInfo*) {} \
157 VK_NULL_DEFINE_DEVICE_OBJ(Fence);
158 VK_NULL_DEFINE_DEVICE_OBJ(Semaphore);
159 VK_NULL_DEFINE_DEVICE_OBJ(Event);
160 VK_NULL_DEFINE_DEVICE_OBJ(QueryPool);
161 VK_NULL_DEFINE_DEVICE_OBJ(BufferView);
162 VK_NULL_DEFINE_DEVICE_OBJ(ImageView);
163 VK_NULL_DEFINE_DEVICE_OBJ(ShaderModule);
164 VK_NULL_DEFINE_DEVICE_OBJ(PipelineCache);
165 VK_NULL_DEFINE_DEVICE_OBJ(PipelineLayout);
166 VK_NULL_DEFINE_DEVICE_OBJ(RenderPass);
167 VK_NULL_DEFINE_DEVICE_OBJ(DescriptorSetLayout);
168 VK_NULL_DEFINE_DEVICE_OBJ(Sampler);
169 VK_NULL_DEFINE_DEVICE_OBJ(Framebuffer);
174 Instance (const VkInstanceCreateInfo* instanceInfo);
177 PFN_vkVoidFunction getProcAddr (const char* name) const { return (PFN_vkVoidFunction)m_functions.getFunction(name); }
180 const tcu::StaticFunctionLibrary m_functions;
186 SurfaceKHR (VkInstance, const VkXlibSurfaceCreateInfoKHR*) {}
187 SurfaceKHR (VkInstance, const VkXcbSurfaceCreateInfoKHR*) {}
188 SurfaceKHR (VkInstance, const VkWaylandSurfaceCreateInfoKHR*) {}
189 SurfaceKHR (VkInstance, const VkMirSurfaceCreateInfoKHR*) {}
190 SurfaceKHR (VkInstance, const VkAndroidSurfaceCreateInfoKHR*) {}
191 SurfaceKHR (VkInstance, const VkWin32SurfaceCreateInfoKHR*) {}
192 SurfaceKHR (VkInstance, const VkDisplaySurfaceCreateInfoKHR*) {}
193 ~SurfaceKHR (void) {}
199 DisplayModeKHR (VkDisplayKHR, const VkDisplayModeCreateInfoKHR*) {}
200 ~DisplayModeKHR (void) {}
203 class DebugReportCallbackEXT
206 DebugReportCallbackEXT (VkInstance, const VkDebugReportCallbackCreateInfoEXT*) {}
207 ~DebugReportCallbackEXT (void) {}
213 Device (VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* deviceInfo);
216 PFN_vkVoidFunction getProcAddr (const char* name) const { return (PFN_vkVoidFunction)m_functions.getFunction(name); }
219 const tcu::StaticFunctionLibrary m_functions;
225 Pipeline (VkDevice, const VkGraphicsPipelineCreateInfo*) {}
226 Pipeline (VkDevice, const VkComputePipelineCreateInfo*) {}
232 SwapchainKHR (VkDevice, const VkSwapchainCreateInfoKHR*) {}
233 ~SwapchainKHR (void) {}
236 class IndirectCommandsLayoutNVX
239 IndirectCommandsLayoutNVX (VkDevice, const VkIndirectCommandsLayoutCreateInfoNVX*) {}
245 ObjectTableNVX (VkDevice, const VkObjectTableCreateInfoNVX*) {}
248 void* allocateHeap (const VkMemoryAllocateInfo* pAllocInfo)
250 // \todo [2015-12-03 pyry] Alignment requirements?
251 // \todo [2015-12-03 pyry] Empty allocations okay?
252 if (pAllocInfo->allocationSize > 0)
254 void* const heapPtr = deMalloc((size_t)pAllocInfo->allocationSize);
256 throw std::bad_alloc();
263 void freeHeap (void* ptr)
271 DeviceMemory (VkDevice, const VkMemoryAllocateInfo* pAllocInfo)
272 : m_memory(allocateHeap(pAllocInfo))
274 // \todo [2016-08-03 pyry] In some cases leaving data unintialized would help valgrind analysis,
275 // but currently it mostly hinders it.
277 deMemset(m_memory, 0xcd, (size_t)pAllocInfo->allocationSize);
284 void* getPtr (void) const { return m_memory; }
287 void* const m_memory;
293 Buffer (VkDevice, const VkBufferCreateInfo* pCreateInfo)
294 : m_size(pCreateInfo->size)
297 VkDeviceSize getSize (void) const { return m_size; }
300 const VkDeviceSize m_size;
306 Image (VkDevice, const VkImageCreateInfo* pCreateInfo)
307 : m_imageType (pCreateInfo->imageType)
308 , m_format (pCreateInfo->format)
309 , m_extent (pCreateInfo->extent)
310 , m_samples (pCreateInfo->samples)
313 VkImageType getImageType (void) const { return m_imageType; }
314 VkFormat getFormat (void) const { return m_format; }
315 VkExtent3D getExtent (void) const { return m_extent; }
316 VkSampleCountFlagBits getSamples (void) const { return m_samples; }
319 const VkImageType m_imageType;
320 const VkFormat m_format;
321 const VkExtent3D m_extent;
322 const VkSampleCountFlagBits m_samples;
328 CommandBuffer(VkDevice, VkCommandPool, VkCommandBufferLevel)
332 class DescriptorUpdateTemplateKHR
335 DescriptorUpdateTemplateKHR (VkDevice, const VkDescriptorUpdateTemplateCreateInfoKHR*) {}
342 CommandPool (VkDevice device, const VkCommandPoolCreateInfo*)
347 VkCommandBuffer allocate (VkCommandBufferLevel level);
348 void free (VkCommandBuffer buffer);
351 const VkDevice m_device;
353 vector<CommandBuffer*> m_buffers;
356 CommandPool::~CommandPool (void)
358 for (size_t ndx = 0; ndx < m_buffers.size(); ++ndx)
359 delete m_buffers[ndx];
362 VkCommandBuffer CommandPool::allocate (VkCommandBufferLevel level)
364 CommandBuffer* const impl = new CommandBuffer(m_device, VkCommandPool(reinterpret_cast<deUintptr>(this)), level);
368 m_buffers.push_back(impl);
376 return reinterpret_cast<VkCommandBuffer>(impl);
379 void CommandPool::free (VkCommandBuffer buffer)
381 CommandBuffer* const impl = reinterpret_cast<CommandBuffer*>(buffer);
383 for (size_t ndx = 0; ndx < m_buffers.size(); ++ndx)
385 if (m_buffers[ndx] == impl)
387 std::swap(m_buffers[ndx], m_buffers.back());
388 m_buffers.pop_back();
394 DE_FATAL("VkCommandBuffer not owned by VkCommandPool");
400 DescriptorSet (VkDevice, VkDescriptorPool, VkDescriptorSetLayout) {}
406 DescriptorPool (VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo)
408 , m_flags (pCreateInfo->flags)
410 ~DescriptorPool (void)
415 VkDescriptorSet allocate (VkDescriptorSetLayout setLayout);
416 void free (VkDescriptorSet set);
421 const VkDevice m_device;
422 const VkDescriptorPoolCreateFlags m_flags;
424 vector<DescriptorSet*> m_managedSets;
427 VkDescriptorSet DescriptorPool::allocate (VkDescriptorSetLayout setLayout)
429 DescriptorSet* const impl = new DescriptorSet(m_device, VkDescriptorPool(reinterpret_cast<deUintptr>(this)), setLayout);
433 m_managedSets.push_back(impl);
441 return VkDescriptorSet(reinterpret_cast<deUintptr>(impl));
444 void DescriptorPool::free (VkDescriptorSet set)
446 DescriptorSet* const impl = reinterpret_cast<DescriptorSet*>((deUintptr)set.getInternal());
448 DE_ASSERT(m_flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT);
451 for (size_t ndx = 0; ndx < m_managedSets.size(); ++ndx)
453 if (m_managedSets[ndx] == impl)
455 std::swap(m_managedSets[ndx], m_managedSets.back());
456 m_managedSets.pop_back();
462 DE_FATAL("VkDescriptorSet not owned by VkDescriptorPool");
465 void DescriptorPool::reset (void)
467 for (size_t ndx = 0; ndx < m_managedSets.size(); ++ndx)
468 delete m_managedSets[ndx];
469 m_managedSets.clear();
472 // API implementation
477 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL getInstanceProcAddr (VkInstance instance, const char* pName)
479 return reinterpret_cast<Instance*>(instance)->getProcAddr(pName);
482 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL getDeviceProcAddr (VkDevice device, const char* pName)
484 return reinterpret_cast<Device*>(device)->getProcAddr(pName);
487 VKAPI_ATTR VkResult VKAPI_CALL createGraphicsPipelines (VkDevice device, VkPipelineCache, deUint32 count, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
492 for (allocNdx = 0; allocNdx < count; allocNdx++)
493 pPipelines[allocNdx] = allocateNonDispHandle<Pipeline, VkPipeline>(device, pCreateInfos+allocNdx, pAllocator);
497 catch (const std::bad_alloc&)
499 for (deUint32 freeNdx = 0; freeNdx < allocNdx; freeNdx++)
500 freeNonDispHandle<Pipeline, VkPipeline>(pPipelines[freeNdx], pAllocator);
502 return VK_ERROR_OUT_OF_HOST_MEMORY;
506 for (deUint32 freeNdx = 0; freeNdx < allocNdx; freeNdx++)
507 freeNonDispHandle<Pipeline, VkPipeline>(pPipelines[freeNdx], pAllocator);
513 VKAPI_ATTR VkResult VKAPI_CALL createComputePipelines (VkDevice device, VkPipelineCache, deUint32 count, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
518 for (allocNdx = 0; allocNdx < count; allocNdx++)
519 pPipelines[allocNdx] = allocateNonDispHandle<Pipeline, VkPipeline>(device, pCreateInfos+allocNdx, pAllocator);
523 catch (const std::bad_alloc&)
525 for (deUint32 freeNdx = 0; freeNdx < allocNdx; freeNdx++)
526 freeNonDispHandle<Pipeline, VkPipeline>(pPipelines[freeNdx], pAllocator);
528 return VK_ERROR_OUT_OF_HOST_MEMORY;
532 for (deUint32 freeNdx = 0; freeNdx < allocNdx; freeNdx++)
533 freeNonDispHandle<Pipeline, VkPipeline>(pPipelines[freeNdx], pAllocator);
539 VKAPI_ATTR VkResult VKAPI_CALL enumeratePhysicalDevices (VkInstance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pDevices)
541 if (pDevices && *pPhysicalDeviceCount >= 1u)
542 *pDevices = reinterpret_cast<VkPhysicalDevice>((void*)(deUintptr)1u);
544 *pPhysicalDeviceCount = 1;
549 VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceFeatures (VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures)
551 DE_UNREF(physicalDevice);
553 // Enable all features allow as many tests to run as possible
554 pFeatures->robustBufferAccess = VK_TRUE;
555 pFeatures->fullDrawIndexUint32 = VK_TRUE;
556 pFeatures->imageCubeArray = VK_TRUE;
557 pFeatures->independentBlend = VK_TRUE;
558 pFeatures->geometryShader = VK_TRUE;
559 pFeatures->tessellationShader = VK_TRUE;
560 pFeatures->sampleRateShading = VK_TRUE;
561 pFeatures->dualSrcBlend = VK_TRUE;
562 pFeatures->logicOp = VK_TRUE;
563 pFeatures->multiDrawIndirect = VK_TRUE;
564 pFeatures->drawIndirectFirstInstance = VK_TRUE;
565 pFeatures->depthClamp = VK_TRUE;
566 pFeatures->depthBiasClamp = VK_TRUE;
567 pFeatures->fillModeNonSolid = VK_TRUE;
568 pFeatures->depthBounds = VK_TRUE;
569 pFeatures->wideLines = VK_TRUE;
570 pFeatures->largePoints = VK_TRUE;
571 pFeatures->alphaToOne = VK_TRUE;
572 pFeatures->multiViewport = VK_TRUE;
573 pFeatures->samplerAnisotropy = VK_TRUE;
574 pFeatures->textureCompressionETC2 = VK_TRUE;
575 pFeatures->textureCompressionASTC_LDR = VK_TRUE;
576 pFeatures->textureCompressionBC = VK_TRUE;
577 pFeatures->occlusionQueryPrecise = VK_TRUE;
578 pFeatures->pipelineStatisticsQuery = VK_TRUE;
579 pFeatures->vertexPipelineStoresAndAtomics = VK_TRUE;
580 pFeatures->fragmentStoresAndAtomics = VK_TRUE;
581 pFeatures->shaderTessellationAndGeometryPointSize = VK_TRUE;
582 pFeatures->shaderImageGatherExtended = VK_TRUE;
583 pFeatures->shaderStorageImageExtendedFormats = VK_TRUE;
584 pFeatures->shaderStorageImageMultisample = VK_TRUE;
585 pFeatures->shaderStorageImageReadWithoutFormat = VK_TRUE;
586 pFeatures->shaderStorageImageWriteWithoutFormat = VK_TRUE;
587 pFeatures->shaderUniformBufferArrayDynamicIndexing = VK_TRUE;
588 pFeatures->shaderSampledImageArrayDynamicIndexing = VK_TRUE;
589 pFeatures->shaderStorageBufferArrayDynamicIndexing = VK_TRUE;
590 pFeatures->shaderStorageImageArrayDynamicIndexing = VK_TRUE;
591 pFeatures->shaderClipDistance = VK_TRUE;
592 pFeatures->shaderCullDistance = VK_TRUE;
593 pFeatures->shaderFloat64 = VK_TRUE;
594 pFeatures->shaderInt64 = VK_TRUE;
595 pFeatures->shaderInt16 = VK_TRUE;
596 pFeatures->shaderResourceResidency = VK_TRUE;
597 pFeatures->shaderResourceMinLod = VK_TRUE;
598 pFeatures->sparseBinding = VK_TRUE;
599 pFeatures->sparseResidencyBuffer = VK_TRUE;
600 pFeatures->sparseResidencyImage2D = VK_TRUE;
601 pFeatures->sparseResidencyImage3D = VK_TRUE;
602 pFeatures->sparseResidency2Samples = VK_TRUE;
603 pFeatures->sparseResidency4Samples = VK_TRUE;
604 pFeatures->sparseResidency8Samples = VK_TRUE;
605 pFeatures->sparseResidency16Samples = VK_TRUE;
606 pFeatures->sparseResidencyAliased = VK_TRUE;
607 pFeatures->variableMultisampleRate = VK_TRUE;
608 pFeatures->inheritedQueries = VK_TRUE;
611 VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceProperties (VkPhysicalDevice, VkPhysicalDeviceProperties* props)
613 deMemset(props, 0, sizeof(VkPhysicalDeviceProperties));
615 props->apiVersion = VK_API_VERSION;
616 props->driverVersion = 1u;
617 props->deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER;
619 deMemcpy(props->deviceName, "null", 5);
622 props->limits.maxImageDimension1D = 4096;
623 props->limits.maxImageDimension2D = 4096;
624 props->limits.maxImageDimension3D = 256;
625 props->limits.maxImageDimensionCube = 4096;
626 props->limits.maxImageArrayLayers = 256;
627 props->limits.maxTexelBufferElements = 65536;
628 props->limits.maxUniformBufferRange = 16384;
629 props->limits.maxStorageBufferRange = 1u<<27;
630 props->limits.maxPushConstantsSize = 128;
631 props->limits.maxMemoryAllocationCount = 4096;
632 props->limits.maxSamplerAllocationCount = 4000;
633 props->limits.bufferImageGranularity = 131072;
634 props->limits.sparseAddressSpaceSize = 1u<<31;
635 props->limits.maxBoundDescriptorSets = 4;
636 props->limits.maxPerStageDescriptorSamplers = 16;
637 props->limits.maxPerStageDescriptorUniformBuffers = 12;
638 props->limits.maxPerStageDescriptorStorageBuffers = 4;
639 props->limits.maxPerStageDescriptorSampledImages = 16;
640 props->limits.maxPerStageDescriptorStorageImages = 4;
641 props->limits.maxPerStageDescriptorInputAttachments = 4;
642 props->limits.maxPerStageResources = 128;
643 props->limits.maxDescriptorSetSamplers = 96;
644 props->limits.maxDescriptorSetUniformBuffers = 72;
645 props->limits.maxDescriptorSetUniformBuffersDynamic = 8;
646 props->limits.maxDescriptorSetStorageBuffers = 24;
647 props->limits.maxDescriptorSetStorageBuffersDynamic = 4;
648 props->limits.maxDescriptorSetSampledImages = 96;
649 props->limits.maxDescriptorSetStorageImages = 24;
650 props->limits.maxDescriptorSetInputAttachments = 4;
651 props->limits.maxVertexInputAttributes = 16;
652 props->limits.maxVertexInputBindings = 16;
653 props->limits.maxVertexInputAttributeOffset = 2047;
654 props->limits.maxVertexInputBindingStride = 2048;
655 props->limits.maxVertexOutputComponents = 64;
656 props->limits.maxTessellationGenerationLevel = 64;
657 props->limits.maxTessellationPatchSize = 32;
658 props->limits.maxTessellationControlPerVertexInputComponents = 64;
659 props->limits.maxTessellationControlPerVertexOutputComponents = 64;
660 props->limits.maxTessellationControlPerPatchOutputComponents = 120;
661 props->limits.maxTessellationControlTotalOutputComponents = 2048;
662 props->limits.maxTessellationEvaluationInputComponents = 64;
663 props->limits.maxTessellationEvaluationOutputComponents = 64;
664 props->limits.maxGeometryShaderInvocations = 32;
665 props->limits.maxGeometryInputComponents = 64;
666 props->limits.maxGeometryOutputComponents = 64;
667 props->limits.maxGeometryOutputVertices = 256;
668 props->limits.maxGeometryTotalOutputComponents = 1024;
669 props->limits.maxFragmentInputComponents = 64;
670 props->limits.maxFragmentOutputAttachments = 4;
671 props->limits.maxFragmentDualSrcAttachments = 1;
672 props->limits.maxFragmentCombinedOutputResources = 4;
673 props->limits.maxComputeSharedMemorySize = 16384;
674 props->limits.maxComputeWorkGroupCount[0] = 65535;
675 props->limits.maxComputeWorkGroupCount[1] = 65535;
676 props->limits.maxComputeWorkGroupCount[2] = 65535;
677 props->limits.maxComputeWorkGroupInvocations = 128;
678 props->limits.maxComputeWorkGroupSize[0] = 128;
679 props->limits.maxComputeWorkGroupSize[1] = 128;
680 props->limits.maxComputeWorkGroupSize[2] = 128;
681 props->limits.subPixelPrecisionBits = 4;
682 props->limits.subTexelPrecisionBits = 4;
683 props->limits.mipmapPrecisionBits = 4;
684 props->limits.maxDrawIndexedIndexValue = 0xffffffffu;
685 props->limits.maxDrawIndirectCount = (1u<<16) - 1u;
686 props->limits.maxSamplerLodBias = 2.0f;
687 props->limits.maxSamplerAnisotropy = 16.0f;
688 props->limits.maxViewports = 16;
689 props->limits.maxViewportDimensions[0] = 4096;
690 props->limits.maxViewportDimensions[1] = 4096;
691 props->limits.viewportBoundsRange[0] = -8192.f;
692 props->limits.viewportBoundsRange[1] = 8191.f;
693 props->limits.viewportSubPixelBits = 0;
694 props->limits.minMemoryMapAlignment = 64;
695 props->limits.minTexelBufferOffsetAlignment = 256;
696 props->limits.minUniformBufferOffsetAlignment = 256;
697 props->limits.minStorageBufferOffsetAlignment = 256;
698 props->limits.minTexelOffset = -8;
699 props->limits.maxTexelOffset = 7;
700 props->limits.minTexelGatherOffset = -8;
701 props->limits.maxTexelGatherOffset = 7;
702 props->limits.minInterpolationOffset = -0.5f;
703 props->limits.maxInterpolationOffset = 0.5f; // -1ulp
704 props->limits.subPixelInterpolationOffsetBits = 4;
705 props->limits.maxFramebufferWidth = 4096;
706 props->limits.maxFramebufferHeight = 4096;
707 props->limits.maxFramebufferLayers = 256;
708 props->limits.framebufferColorSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
709 props->limits.framebufferDepthSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
710 props->limits.framebufferStencilSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
711 props->limits.framebufferNoAttachmentsSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
712 props->limits.maxColorAttachments = 4;
713 props->limits.sampledImageColorSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
714 props->limits.sampledImageIntegerSampleCounts = VK_SAMPLE_COUNT_1_BIT;
715 props->limits.sampledImageDepthSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
716 props->limits.sampledImageStencilSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
717 props->limits.storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
718 props->limits.maxSampleMaskWords = 1;
719 props->limits.timestampComputeAndGraphics = VK_TRUE;
720 props->limits.timestampPeriod = 1.0f;
721 props->limits.maxClipDistances = 8;
722 props->limits.maxCullDistances = 8;
723 props->limits.maxCombinedClipAndCullDistances = 8;
724 props->limits.discreteQueuePriorities = 2;
725 props->limits.pointSizeRange[0] = 1.0f;
726 props->limits.pointSizeRange[1] = 64.0f; // -1ulp
727 props->limits.lineWidthRange[0] = 1.0f;
728 props->limits.lineWidthRange[1] = 8.0f; // -1ulp
729 props->limits.pointSizeGranularity = 1.0f;
730 props->limits.lineWidthGranularity = 1.0f;
731 props->limits.strictLines = 0;
732 props->limits.standardSampleLocations = VK_TRUE;
733 props->limits.optimalBufferCopyOffsetAlignment = 256;
734 props->limits.optimalBufferCopyRowPitchAlignment = 256;
735 props->limits.nonCoherentAtomSize = 128;
738 VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceQueueFamilyProperties (VkPhysicalDevice, deUint32* count, VkQueueFamilyProperties* props)
740 if (props && *count >= 1u)
742 deMemset(props, 0, sizeof(VkQueueFamilyProperties));
744 props->queueCount = 4u;
745 props->queueFlags = VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT;
746 props->timestampValidBits = 64;
752 VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceMemoryProperties (VkPhysicalDevice, VkPhysicalDeviceMemoryProperties* props)
754 deMemset(props, 0, sizeof(VkPhysicalDeviceMemoryProperties));
756 props->memoryTypeCount = 1u;
757 props->memoryTypes[0].heapIndex = 0u;
758 props->memoryTypes[0].propertyFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
760 props->memoryHeapCount = 1u;
761 props->memoryHeaps[0].size = 1ull << 31;
762 props->memoryHeaps[0].flags = 0u;
765 VKAPI_ATTR void VKAPI_CALL getPhysicalDeviceFormatProperties (VkPhysicalDevice, VkFormat, VkFormatProperties* pFormatProperties)
767 const VkFormatFeatureFlags allFeatures = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
768 | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
769 | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
770 | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
771 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
772 | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT
773 | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
774 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
775 | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
776 | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
777 | VK_FORMAT_FEATURE_BLIT_SRC_BIT
778 | VK_FORMAT_FEATURE_BLIT_DST_BIT
779 | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
781 pFormatProperties->linearTilingFeatures = allFeatures;
782 pFormatProperties->optimalTilingFeatures = allFeatures;
783 pFormatProperties->bufferFeatures = allFeatures;
786 VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceImageFormatProperties (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties)
788 DE_UNREF(physicalDevice);
795 pImageFormatProperties->maxArrayLayers = 8;
796 pImageFormatProperties->maxExtent.width = 4096;
797 pImageFormatProperties->maxExtent.height = 4096;
798 pImageFormatProperties->maxExtent.depth = 4096;
799 pImageFormatProperties->maxMipLevels = deLog2Ceil32(4096) + 1;
800 pImageFormatProperties->maxResourceSize = 64u * 1024u * 1024u;
801 pImageFormatProperties->sampleCounts = VK_SAMPLE_COUNT_1_BIT|VK_SAMPLE_COUNT_4_BIT;
806 VKAPI_ATTR void VKAPI_CALL getDeviceQueue (VkDevice device, deUint32 queueFamilyIndex, deUint32 queueIndex, VkQueue* pQueue)
809 DE_UNREF(queueFamilyIndex);
812 *pQueue = reinterpret_cast<VkQueue>((deUint64)queueIndex + 1);
815 VKAPI_ATTR void VKAPI_CALL getBufferMemoryRequirements (VkDevice, VkBuffer bufferHandle, VkMemoryRequirements* requirements)
817 const Buffer* buffer = reinterpret_cast<const Buffer*>(bufferHandle.getInternal());
819 requirements->memoryTypeBits = 1u;
820 requirements->size = buffer->getSize();
821 requirements->alignment = (VkDeviceSize)1u;
824 VkDeviceSize getPackedImageDataSize (VkFormat format, VkExtent3D extent, VkSampleCountFlagBits samples)
826 return (VkDeviceSize)getPixelSize(mapVkFormat(format))
827 * (VkDeviceSize)extent.width
828 * (VkDeviceSize)extent.height
829 * (VkDeviceSize)extent.depth
830 * (VkDeviceSize)samples;
833 VkDeviceSize getCompressedImageDataSize (VkFormat format, VkExtent3D extent)
837 const tcu::CompressedTexFormat tcuFormat = mapVkCompressedFormat(format);
838 const size_t blockSize = tcu::getBlockSize(tcuFormat);
839 const tcu::IVec3 blockPixelSize = tcu::getBlockPixelSize(tcuFormat);
840 const int numBlocksX = deDivRoundUp32((int)extent.width, blockPixelSize.x());
841 const int numBlocksY = deDivRoundUp32((int)extent.height, blockPixelSize.y());
842 const int numBlocksZ = deDivRoundUp32((int)extent.depth, blockPixelSize.z());
844 return blockSize*numBlocksX*numBlocksY*numBlocksZ;
848 return 0; // Unsupported compressed format
852 VKAPI_ATTR void VKAPI_CALL getImageMemoryRequirements (VkDevice, VkImage imageHandle, VkMemoryRequirements* requirements)
854 const Image* image = reinterpret_cast<const Image*>(imageHandle.getInternal());
856 requirements->memoryTypeBits = 1u;
857 requirements->alignment = 16u;
859 if (isCompressedFormat(image->getFormat()))
860 requirements->size = getCompressedImageDataSize(image->getFormat(), image->getExtent());
862 requirements->size = getPackedImageDataSize(image->getFormat(), image->getExtent(), image->getSamples());
865 VKAPI_ATTR VkResult VKAPI_CALL mapMemory (VkDevice, VkDeviceMemory memHandle, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData)
867 const DeviceMemory* memory = reinterpret_cast<DeviceMemory*>(memHandle.getInternal());
872 *ppData = (deUint8*)memory->getPtr() + offset;
877 VKAPI_ATTR VkResult VKAPI_CALL allocateDescriptorSets (VkDevice, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets)
879 DescriptorPool* const poolImpl = reinterpret_cast<DescriptorPool*>((deUintptr)pAllocateInfo->descriptorPool.getInternal());
881 for (deUint32 ndx = 0; ndx < pAllocateInfo->descriptorSetCount; ++ndx)
885 pDescriptorSets[ndx] = poolImpl->allocate(pAllocateInfo->pSetLayouts[ndx]);
887 catch (const std::bad_alloc&)
889 for (deUint32 freeNdx = 0; freeNdx < ndx; freeNdx++)
890 delete reinterpret_cast<DescriptorSet*>((deUintptr)pDescriptorSets[freeNdx].getInternal());
892 return VK_ERROR_OUT_OF_HOST_MEMORY;
896 for (deUint32 freeNdx = 0; freeNdx < ndx; freeNdx++)
897 delete reinterpret_cast<DescriptorSet*>((deUintptr)pDescriptorSets[freeNdx].getInternal());
906 VKAPI_ATTR void VKAPI_CALL freeDescriptorSets (VkDevice, VkDescriptorPool descriptorPool, deUint32 count, const VkDescriptorSet* pDescriptorSets)
908 DescriptorPool* const poolImpl = reinterpret_cast<DescriptorPool*>((deUintptr)descriptorPool.getInternal());
910 for (deUint32 ndx = 0; ndx < count; ++ndx)
911 poolImpl->free(pDescriptorSets[ndx]);
914 VKAPI_ATTR VkResult VKAPI_CALL resetDescriptorPool (VkDevice, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags)
916 DescriptorPool* const poolImpl = reinterpret_cast<DescriptorPool*>((deUintptr)descriptorPool.getInternal());
923 VKAPI_ATTR VkResult VKAPI_CALL allocateCommandBuffers (VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers)
927 if (pAllocateInfo && pCommandBuffers)
929 CommandPool* const poolImpl = reinterpret_cast<CommandPool*>((deUintptr)pAllocateInfo->commandPool.getInternal());
931 for (deUint32 ndx = 0; ndx < pAllocateInfo->commandBufferCount; ++ndx)
932 pCommandBuffers[ndx] = poolImpl->allocate(pAllocateInfo->level);
938 VKAPI_ATTR void VKAPI_CALL freeCommandBuffers (VkDevice device, VkCommandPool commandPool, deUint32 commandBufferCount, const VkCommandBuffer* pCommandBuffers)
940 CommandPool* const poolImpl = reinterpret_cast<CommandPool*>((deUintptr)commandPool.getInternal());
944 for (deUint32 ndx = 0; ndx < commandBufferCount; ++ndx)
945 poolImpl->free(pCommandBuffers[ndx]);
949 VKAPI_ATTR VkResult VKAPI_CALL createDisplayModeKHR (VkPhysicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode)
951 DE_UNREF(pAllocator);
952 VK_NULL_RETURN((*pMode = allocateNonDispHandle<DisplayModeKHR, VkDisplayModeKHR>(display, pCreateInfo, pAllocator)));
955 VKAPI_ATTR VkResult VKAPI_CALL createSharedSwapchainsKHR (VkDevice device, deUint32 swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains)
957 for (deUint32 ndx = 0; ndx < swapchainCount; ++ndx)
959 pSwapchains[ndx] = allocateNonDispHandle<SwapchainKHR, VkSwapchainKHR>(device, pCreateInfos+ndx, pAllocator);
965 #include "vkNullDriverImpl.inl"
969 Instance::Instance (const VkInstanceCreateInfo*)
970 : m_functions(s_instanceFunctions, DE_LENGTH_OF_ARRAY(s_instanceFunctions))
974 Device::Device (VkPhysicalDevice, const VkDeviceCreateInfo*)
975 : m_functions(s_deviceFunctions, DE_LENGTH_OF_ARRAY(s_deviceFunctions))
979 class NullDriverLibrary : public Library
982 NullDriverLibrary (void)
983 : m_library (s_platformFunctions, DE_LENGTH_OF_ARRAY(s_platformFunctions))
984 , m_driver (m_library)
987 const PlatformInterface& getPlatformInterface (void) const { return m_driver; }
990 const tcu::StaticFunctionLibrary m_library;
991 const PlatformDriver m_driver;
996 Library* createNullDriver (void)
998 return new NullDriverLibrary();