From: Pyry Haulos Date: Tue, 10 Nov 2015 21:20:15 +0000 (-0800) Subject: Check for tess/geom support in binding model tests X-Git-Tag: upstream/0.1.0~812^2~526^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=624101c33dc0b50a2293e4148907781bca0e4cb7;p=platform%2Fupstream%2FVK-GL-CTS.git Check for tess/geom support in binding model tests Change-Id: I5bd8ab480b90135f137fc24bec7a71de680c7892 --- diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp index ade0c54..b189901 100644 --- a/external/vulkancts/framework/vulkan/vkQueryUtil.cpp +++ b/external/vulkancts/framework/vulkan/vkQueryUtil.cpp @@ -179,4 +179,14 @@ vector enumerateDeviceExtensionProperties (const Instance return properties; } +bool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStage stage) +{ + if (stage == VK_SHADER_STAGE_TESS_CONTROL || stage == VK_SHADER_STAGE_TESS_EVALUATION) + return deviceFeatures.tessellationShader == VK_TRUE; + else if (stage == VK_SHADER_STAGE_GEOMETRY) + return deviceFeatures.geometryShader == VK_TRUE; + else + return true; +} + } // vk diff --git a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp index 8cecc1f..1192bcb 100644 --- a/external/vulkancts/framework/vulkan/vkQueryUtil.hpp +++ b/external/vulkancts/framework/vulkan/vkQueryUtil.hpp @@ -54,6 +54,8 @@ std::vector enumerateInstanceExtensionProperties (const std::vector enumerateDeviceLayerProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice); std::vector enumerateDeviceExtensionProperties (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, const char* layerName); +bool isShaderStageSupported (const VkPhysicalDeviceFeatures& deviceFeatures, VkShaderStage stage); + } // vk #endif // _VKQUERYUTIL_HPP diff --git a/external/vulkancts/modules/vulkan/binding_model/vktBindingShaderAccessTests.cpp b/external/vulkancts/modules/vulkan/binding_model/vktBindingShaderAccessTests.cpp index b6b5c6d..f226d29 100644 --- a/external/vulkancts/modules/vulkan/binding_model/vktBindingShaderAccessTests.cpp +++ b/external/vulkancts/modules/vulkan/binding_model/vktBindingShaderAccessTests.cpp @@ -802,22 +802,24 @@ tcu::TestStatus SingleTargetRenderInstance::iterate (void) class RenderInstanceShaders { public: - RenderInstanceShaders (const vk::DeviceInterface& vki, - vk::VkDevice device, - const vk::BinaryCollection& programCollection); + RenderInstanceShaders (const vk::DeviceInterface& vki, + vk::VkDevice device, + const vk::VkPhysicalDeviceFeatures& deviceFeatures, + const vk::BinaryCollection& programCollection); inline bool hasTessellationStage (void) const { return *m_tessCtrlShader != 0 || *m_tessEvalShader != 0; } inline deUint32 getNumStages (void) const { return (deUint32)m_stageInfos.size(); } inline const vk::VkPipelineShaderStageCreateInfo* getStages (void) const { return &m_stageInfos[0]; } private: - void addStage (const vk::DeviceInterface& vki, - vk::VkDevice device, - const vk::BinaryCollection& programCollection, - const char* name, - vk::VkShaderStage stage, - vk::Move* outModule, - vk::Move* outShader); + void addStage (const vk::DeviceInterface& vki, + vk::VkDevice device, + const vk::VkPhysicalDeviceFeatures& deviceFeatures, + const vk::BinaryCollection& programCollection, + const char* name, + vk::VkShaderStage stage, + vk::Move* outModule, + vk::Move* outShader); vk::VkPipelineShaderStageCreateInfo getShaderStageCreateInfo (vk::VkShaderStage stage, vk::VkShader shader) const; @@ -834,44 +836,51 @@ private: std::vector m_stageInfos; }; -RenderInstanceShaders::RenderInstanceShaders (const vk::DeviceInterface& vki, - vk::VkDevice device, - const vk::BinaryCollection& programCollection) +RenderInstanceShaders::RenderInstanceShaders (const vk::DeviceInterface& vki, + vk::VkDevice device, + const vk::VkPhysicalDeviceFeatures& deviceFeatures, + const vk::BinaryCollection& programCollection) { - addStage(vki, device, programCollection, "vertex", vk::VK_SHADER_STAGE_VERTEX, &m_vertexShaderModule, &m_vertexShader); - addStage(vki, device, programCollection, "tess_ctrl", vk::VK_SHADER_STAGE_TESS_CONTROL, &m_tessCtrlShaderModule, &m_tessCtrlShader); - addStage(vki, device, programCollection, "tess_eval", vk::VK_SHADER_STAGE_TESS_EVALUATION, &m_tessEvalShaderModule, &m_tessEvalShader); - addStage(vki, device, programCollection, "geometry", vk::VK_SHADER_STAGE_GEOMETRY, &m_geometryShaderModule, &m_geometryShader); - addStage(vki, device, programCollection, "fragment", vk::VK_SHADER_STAGE_FRAGMENT, &m_fragmentShaderModule, &m_fragmentShader); + addStage(vki, device, deviceFeatures, programCollection, "vertex", vk::VK_SHADER_STAGE_VERTEX, &m_vertexShaderModule, &m_vertexShader); + addStage(vki, device, deviceFeatures, programCollection, "tess_ctrl", vk::VK_SHADER_STAGE_TESS_CONTROL, &m_tessCtrlShaderModule, &m_tessCtrlShader); + addStage(vki, device, deviceFeatures, programCollection, "tess_eval", vk::VK_SHADER_STAGE_TESS_EVALUATION, &m_tessEvalShaderModule, &m_tessEvalShader); + addStage(vki, device, deviceFeatures, programCollection, "geometry", vk::VK_SHADER_STAGE_GEOMETRY, &m_geometryShaderModule, &m_geometryShader); + addStage(vki, device, deviceFeatures, programCollection, "fragment", vk::VK_SHADER_STAGE_FRAGMENT, &m_fragmentShaderModule, &m_fragmentShader); DE_ASSERT(!m_stageInfos.empty()); } -void RenderInstanceShaders::addStage (const vk::DeviceInterface& vki, - vk::VkDevice device, - const vk::BinaryCollection& programCollection, - const char* name, - vk::VkShaderStage stage, - vk::Move* outModule, - vk::Move* outShader) +void RenderInstanceShaders::addStage (const vk::DeviceInterface& vki, + vk::VkDevice device, + const vk::VkPhysicalDeviceFeatures& deviceFeatures, + const vk::BinaryCollection& programCollection, + const char* name, + vk::VkShaderStage stage, + vk::Move* outModule, + vk::Move* outShader) { if (programCollection.contains(name)) { - vk::Move module = createShaderModule(vki, device, programCollection.get(name), (vk::VkShaderModuleCreateFlags)0); - const vk::VkShaderCreateInfo createInfo = + if (vk::isShaderStageSupported(deviceFeatures, stage)) { - vk::VK_STRUCTURE_TYPE_SHADER_CREATE_INFO, - DE_NULL, - *module, // module - "main", // pName - 0u, // flags - stage - }; - vk::Move shader = vk::createShader(vki, device, &createInfo); + vk::Move module = createShaderModule(vki, device, programCollection.get(name), (vk::VkShaderModuleCreateFlags)0); + const vk::VkShaderCreateInfo createInfo = + { + vk::VK_STRUCTURE_TYPE_SHADER_CREATE_INFO, + DE_NULL, + *module, // module + "main", // pName + 0u, // flags + stage + }; + vk::Move shader = vk::createShader(vki, device, &createInfo); - m_stageInfos.push_back(getShaderStageCreateInfo(stage, *shader)); - *outModule = module; - *outShader = shader; + m_stageInfos.push_back(getShaderStageCreateInfo(stage, *shader)); + *outModule = module; + *outShader = shader; + } + else + TCU_THROW(NotSupportedError, (de::toString(stage) + " is not supported").c_str()); } } @@ -916,7 +925,7 @@ SingleCmdRenderInstance::SingleCmdRenderInstance (Context& context, vk::Move SingleCmdRenderInstance::createPipeline (vk::VkPipelineLayout pipelineLayout) { - const RenderInstanceShaders shaderStages (m_vki, m_device, m_context.getBinaryCollection()); + const RenderInstanceShaders shaderStages (m_vki, m_device, m_context.getDeviceFeatures(), m_context.getBinaryCollection()); const vk::VkPrimitiveTopology topology = shaderStages.hasTessellationStage() ? vk::VK_PRIMITIVE_TOPOLOGY_PATCH : vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; const vk::VkPipelineVertexInputStateCreateInfo vertexInputState = {