Home | History | Annotate | Download | only in binding_model

Lines Matching refs:vk

115 std::string genPerVertexBlock (const vk::VkShaderStageFlagBits stage, const glu::GLSLVersion version)
126 case vk::VK_SHADER_STAGE_VERTEX_BIT:
130 case vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
135 case vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
140 case vk::VK_SHADER_STAGE_GEOMETRY_BIT:
152 bool isUniformDescriptorType (vk::VkDescriptorType type)
154 return type == vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ||
155 type == vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
156 type == vk::VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
159 bool isDynamicDescriptorType (vk::VkDescriptorType type)
161 return type == vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC || type == vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
165 const vk::VkPhysicalDeviceFeatures& deviceFeatures,
168 vk::VkDescriptorType descType,
169 vk::VkShaderStageFlags activeStages)
184 if (!vk::isCoreDeviceExtension(apiVersion, "VK_KHR_descriptor_update_template"))
223 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
224 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
225 case vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
226 case vk::VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
227 case vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
228 case vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
232 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
233 case vk::VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
234 case vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
235 case vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
236 if (activeStages & (vk::VK_SHADER_STAGE_VERTEX_BIT |
237 vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
238 vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT |
239 vk::VK_SHADER_STAGE_GEOMETRY_BIT))
245 if (activeStages & vk::VK_SHADER_STAGE_FRAGMENT_BIT)
257 vk::VkImageType viewTypeToImageType (vk::VkImageViewType type)
261 case vk::VK_IMAGE_VIEW_TYPE_1D:
262 case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY: return vk::VK_IMAGE_TYPE_1D;
263 case vk::VK_IMAGE_VIEW_TYPE_2D:
264 case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY: return vk::VK_IMAGE_TYPE_2D;
265 case vk::VK_IMAGE_VIEW_TYPE_3D: return vk::VK_IMAGE_TYPE_3D;
266 case vk::VK_IMAGE_VIEW_TYPE_CUBE:
267 case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return vk::VK_IMAGE_TYPE_2D;
271 return (vk::VkImageType)0;
275 vk::VkImageLayout getImageLayoutForDescriptorType (vk::VkDescriptorType descType)
277 if (descType == vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
278 return vk::VK_IMAGE_LAYOUT_GENERAL;
280 return vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
298 void writeTextureLevelPyramidData (void* dst, deUint32 dstLen, const tcu::TextureLevelPyramid& srcImage, vk::VkImageViewType viewType, std::vector<vk::VkBufferImageCopy>* copySlices)
301 const deUint32 arraySize = (viewType == vk::VK_IMAGE_VIEW_TYPE_1D || viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (srcImage.getLevel(0).getHeight()) :
302 (viewType == vk::VK_IMAGE_VIEW_TYPE_2D || viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? (srcImage.getLevel(0).getDepth()) :
303 (viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? (1) :
304 (viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? (srcImage.getLevel(0).getDepth()) :
316 const deInt32 sliceHeight = (viewType == vk::VK_IMAGE_VIEW_TYPE_1D || viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (1) : (srcAccess.getHeight());
317 const deInt32 sliceDepth = (viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? (srcAccess.getDepth()) : (1);
325 const vk::VkBufferImageCopy copySlice =
327 (vk::VkDeviceSize)levelOffset + sliceNdx * sliceDataSize, // bufferOffset
331 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
360 de::MovePtr<vk::Allocation> allocateAndBindObjectMemory (const vk::DeviceInterface& vki, vk::VkDevice device, vk::Allocator& allocator, vk::VkBuffer buffer, vk::MemoryRequirement requirement)
362 const vk::VkMemoryRequirements requirements = vk::getBufferMemoryRequirements(vki, device, buffer);
363 de::MovePtr<vk::Allocation> allocation = allocator.allocate(requirements, requirement);
369 de::MovePtr<vk::Allocation> allocateAndBindObjectMemory (const vk::DeviceInterface& vki, vk::VkDevice device, vk::Allocator& allocator, vk::VkImage image, vk::MemoryRequirement requirement)
371 const vk::VkMemoryRequirements requirements = vk::getImageMemoryRequirements(vki, device, image);
372 de::MovePtr<vk::Allocation> allocation = allocator.allocate(requirements, requirement);
378 vk::VkDescriptorImageInfo makeDescriptorImageInfo (vk::VkSampler sampler)
380 return vk::makeDescriptorImageInfo(sampler, (vk::VkImageView)0, (vk::VkImageLayout)0);
383 vk::VkDescriptorImageInfo makeDescriptorImageInfo (vk::VkImageView imageView, vk::VkImageLayout layout)
385 return vk::makeDescriptorImageInfo((vk::VkSampler)0, imageView, layout);
396 static const vk::VkDescriptorUpdateTemplateEntry createTemplateBinding (deUint32 binding, deUint32 arrayElement, deUint32 descriptorCount, vk::VkDescriptorType descriptorType, size_t offset, size_t stride)
398 const vk::VkDescriptorUpdateTemplateEntry updateBinding =
464 static vk::Move<vk::VkImage> createColorAttachment (const vk::DeviceInterface& vki,
465 vk::VkDevice device,
466 vk::Allocator& allocator,
469 de::MovePtr<vk::Allocation>* outAllocation);
471 static vk::Move<vk::VkImageView> createColorAttachmentView (const vk::DeviceInterface& vki,
472 vk::VkDevice device,
474 vk::VkImage image);
476 static vk::Move<vk::VkRenderPass> createRenderPass (const vk::DeviceInterface& vki,
477 vk::VkDevice device,
480 static vk::Move<vk::VkFramebuffer> createFramebuffer (const vk::DeviceInterface& vki,
481 vk::VkDevice device,
482 vk::VkRenderPass renderpass,
483 vk::VkImageView colorAttachmentView,
486 static vk::Move<vk::VkCommandPool> createCommandPool (const vk::DeviceInterface& vki,
487 vk::VkDevice device,
501 const vk::DeviceInterface& m_vki;
502 const vk::VkDevice m_device;
503 const vk::VkQueue m_queue;
505 vk::Allocator& m_allocator;
506 de::MovePtr<vk::Allocation> m_colorAttachmentMemory;
507 const vk::Unique<vk::VkImage> m_colorAttachmentImage;
508 const vk::Unique<vk::VkImageView> m_colorAttachmentView;
509 const vk::Unique<vk::VkRenderPass> m_renderPass;
510 const vk::Unique<vk::VkFramebuffer> m_framebuffer;
511 const vk::Unique<vk::VkCommandPool> m_cmdPool;
536 vk::Move<vk::VkImage> SingleTargetRenderInstance::createColorAttachment (const vk::DeviceInterface& vki,
537 vk::VkDevice device,
538 vk::Allocator& allocator,
541 de::MovePtr<vk::Allocation>* outAllocation)
543 const vk::VkImageCreateInfo imageInfo =
545 vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
547 (vk::VkImageCreateFlags)0,
548 vk::VK_IMAGE_TYPE_2D, // imageType
549 vk::mapTextureFormat(format), // format
553 vk::VK_SAMPLE_COUNT_1_BIT, // samples
554 vk::VK_IMAGE_TILING_OPTIMAL, // tiling
555 vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // usage
556 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
559 vk::VK_IMAGE_LAYOUT_UNDEFINED, // initialLayout
562 vk::Move<vk::VkImage> image (vk::createImage(vki, device, &imageInfo));
563 de::MovePtr<vk::Allocation> allocation (allocateAndBindObjectMemory(vki, device, allocator, *image, vk::MemoryRequirement::Any));
569 vk::Move<vk::VkImageView> SingleTargetRenderInstance::createColorAttachmentView (const vk::DeviceInterface& vki,
570 vk::VkDevice device,
572 vk::VkImage image)
574 const vk::VkImageViewCreateInfo createInfo =
576 vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
578 (vk::VkImageViewCreateFlags)0,
580 vk::VK_IMAGE_VIEW_TYPE_2D, // viewType
581 vk::mapTextureFormat(format), // format
582 vk::makeComponentMappingRGBA(),
584 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
592 return vk::createImageView(vki, device, &createInfo);
595 vk::Move<vk::VkRenderPass> SingleTargetRenderInstance::createRenderPass (const vk::DeviceInterface& vki,
596 vk::VkDevice device,
599 const vk::VkAttachmentDescription attachmentDescription =
601 (vk::VkAttachmentDescriptionFlags)0,
602 vk::mapTextureFormat(format), // format
603 vk::VK_SAMPLE_COUNT_1_BIT, // samples
604 vk::VK_ATTACHMENT_LOAD_OP_CLEAR, // loadOp
605 vk::VK_ATTACHMENT_STORE_OP_STORE, // storeOp
606 vk::VK_ATTACHMENT_LOAD_OP_DONT_CARE, // stencilLoadOp
607 vk::VK_ATTACHMENT_STORE_OP_DONT_CARE, // stencilStoreOp
608 vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // initialLayout
609 vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // finalLayout
611 const vk::VkAttachmentReference colorAttachment =
614 vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // layout
616 const vk::VkAttachmentReference depthStencilAttachment =
619 vk::VK_IMAGE_LAYOUT_UNDEFINED // layout
621 const vk::VkSubpassDescription subpass =
623 (vk::VkSubpassDescriptionFlags)0,
624 vk::VK_PIPELINE_BIND_POINT_GRAPHICS, // pipelineBindPoint
634 const vk::VkRenderPassCreateInfo renderPassCreateInfo =
636 vk::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
638 (vk::VkRenderPassCreateFlags)0,
647 return vk::createRenderPass(vki, device, &renderPassCreateInfo);
650 vk::Move<vk::VkFramebuffer> SingleTargetRenderInstance::createFramebuffer (const vk::DeviceInterface& vki,
651 vk::VkDevice device,
652 vk::VkRenderPass renderpass,
653 vk::VkImageView colorAttachmentView,
656 const vk::VkFramebufferCreateInfo framebufferCreateInfo =
658 vk::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
660 (vk::VkFramebufferCreateFlags)0,
669 return vk::createFramebuffer(vki, device, &framebufferCreateInfo);
672 vk::Move<vk::VkCommandPool> SingleTargetRenderInstance::createCommandPool (const vk::DeviceInterface& vki,
673 vk::VkDevice device,
676 return vk::createCommandPool(vki, device, vk::VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, queueFamilyIndex);
682 const vk::VkBufferCreateInfo bufferCreateInfo =
684 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
688 vk::VK_BUFFER_USAGE_TRANSFER_DST_BIT, // usage
689 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
693 const vk::Unique<vk::VkBuffer> buffer (vk::createBuffer(m_vki, m_device, &bufferCreateInfo));
694 const vk::VkImageSubresourceRange fullSubrange =
696 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
702 const vk::VkImageMemoryBarrier imageBarrier =
704 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
706 vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
707 vk::VK_ACCESS_TRANSFER_READ_BIT, // dstAccessMask
708 vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout
709 vk::VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout
715 const vk::VkBufferMemoryBarrier memoryBarrier =
717 vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
719 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask
720 vk::VK_ACCESS_HOST_READ_BIT, // dstAccessMask
725 (vk::VkDeviceSize)pixelDataSize // size
727 const vk::VkCommandBufferBeginInfo cmdBufBeginInfo =
729 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
731 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
732 (const vk::VkCommandBufferInheritanceInfo*)DE_NULL,
734 const vk::VkImageSubresourceLayers firstSlice =
736 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspect
741 const vk::VkBufferImageCopy copyRegion =
751 const de::MovePtr<vk::Allocation> bufferMemory = allocateAndBindObjectMemory(m_vki, m_device, m_allocator, *buffer, vk::MemoryRequirement::HostVisible);
753 const vk::Unique<vk::VkCommandBuffer> cmd (vk::allocateCommandBuffer(m_vki, m_device, *m_cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
754 const vk::Unique<vk::VkFence> cmdCompleteFence (vk::createFence(m_vki, m_device));
759 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, (vk::VkDependencyFlags)0,
760 0, (const vk::VkMemoryBarrier*)DE_NULL,
761 0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
763 m_vki.cmdCopyImageToBuffer(*cmd, *m_colorAttachmentImage, vk::VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, 1, &copyRegion);
764 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (vk::VkDependencyFlags)0,
765 0, (const vk::VkMemoryBarrier*)DE_NULL,
767 0, (const vk::VkImageMemoryBarrier*)DE_NULL);
772 const vk::VkSubmitInfo submitInfo =
774 vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
777 (const vk::VkSemaphore*)0,
778 (const vk::VkPipelineStageFlags*)DE_NULL,
782 (const vk::VkSemaphore*)0,
810 const vk::VkImageSubresourceRange fullSubrange =
812 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
818 const vk::VkImageMemoryBarrier imageBarrier =
820 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
823 vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // dstAccessMask
824 vk::VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout
825 vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // newLayout
831 const vk::VkCommandBufferBeginInfo cmdBufBeginInfo =
833 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
835 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
836 (const vk::VkCommandBufferInheritanceInfo*)DE_NULL,
839 const vk::Unique<vk::VkCommandBuffer> cmd (vk::allocateCommandBuffer(m_vki, m_device, *m_cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
840 const vk::Unique<vk::VkFence> fence (vk::createFence(m_vki, m_device));
844 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (vk::VkDependencyFlags)0,
845 0, (const vk::VkMemoryBarrier*)DE_NULL,
846 0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
851 const vk::VkSubmitInfo submitInfo =
853 vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
856 (const vk::VkSemaphore*)0,
857 (const vk::VkPipelineStageFlags*)DE_NULL,
861 (const vk::VkSemaphore*)0,
880 RenderInstanceShaders (const vk::DeviceInterface& vki,
881 vk::VkDevice device,
882 const vk::VkPhysicalDeviceFeatures& deviceFeatures,
883 const vk::BinaryCollection& programCollection);
887 inline const vk::VkPipelineShaderStageCreateInfo* getStages (void) const { return &m_stageInfos[0]; }
890 void addStage (const vk::DeviceInterface& vki,
891 vk::VkDevice device,
892 const vk::VkPhysicalDeviceFeatures& deviceFeatures,
893 const vk::BinaryCollection& programCollection,
895 vk::VkShaderStageFlagBits stage,
896 vk::Move<vk::VkShaderModule>* outModule);
898 vk::VkPipelineShaderStageCreateInfo getShaderStageCreateInfo (vk::VkShaderStageFlagBits stage, vk::VkShaderModule shader) const;
900 vk::Move<vk::VkShaderModule> m_vertexShaderModule;
901 vk::Move<vk::VkShaderModule> m_tessCtrlShaderModule;
902 vk::Move<vk::VkShaderModule> m_tessEvalShaderModule;
903 vk::Move<vk::VkShaderModule> m_geometryShaderModule;
904 vk::Move<vk::VkShaderModule> m_fragmentShaderModule;
905 std::vector<vk::VkPipelineShaderStageCreateInfo> m_stageInfos;
908 RenderInstanceShaders::RenderInstanceShaders (const vk::DeviceInterface& vki,
909 vk::VkDevice device,
910 const vk::VkPhysicalDeviceFeatures& deviceFeatures,
911 const vk::BinaryCollection& programCollection)
913 addStage(vki, device, deviceFeatures, programCollection, "vertex", vk::VK_SHADER_STAGE_VERTEX_BIT, &m_vertexShaderModule);
914 vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, &m_tessCtrlShaderModule);
915 addStage(vki, device, deviceFeatures, programCollection, "tess_eval", vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, &m_tessEvalShaderModule);
916 addStage(vki, device, deviceFeatures, programCollection, "geometry", vk::VK_SHADER_STAGE_GEOMETRY_BIT, &m_geometryShaderModule);
917 addStage(vki, device, deviceFeatures, programCollection, "fragment", vk::VK_SHADER_STAGE_FRAGMENT_BIT, &m_fragmentShaderModule);
922 void RenderInstanceShaders::addStage (const vk::DeviceInterface& vki,
923 vk::VkDevice device,
924 const vk::VkPhysicalDeviceFeatures& deviceFeatures,
925 const vk::BinaryCollection& programCollection,
927 vk::VkShaderStageFlagBits stage,
928 vk::Move<vk::VkShaderModule>* outModule)
932 if (vk::isShaderStageSupported(deviceFeatures, stage))
934 vk::Move<vk::VkShaderModule> module = createShaderModule(vki, device, programCollection.get(name), (vk::VkShaderModuleCreateFlags)0);
949 vk::VkPipelineShaderStageCreateInfo RenderInstanceShaders::getShaderStageCreateInfo (vk::VkShaderStageFlagBits stage, vk::VkShaderModule shader) const
951 const vk::VkPipelineShaderStageCreateInfo stageCreateInfo =
953 vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
955 (vk::VkPipelineShaderStageCreateFlags)0,
972 vk::Move<vk::VkPipeline> createPipeline (vk::VkPipelineLayout pipelineLayout);
974 virtual vk::VkPipelineLayout getPipelineLayout (void) const = 0;
975 virtual void writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const = 0;
990 vk::Move<vk::VkPipeline> SingleCmdRenderInstance::createPipeline (vk::VkPipelineLayout pipelineLayout)
993 const vk::VkPrimitiveTopology topology = shaderStages.hasTessellationStage() ? vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
994 const vk::VkPipelineVertexInputStateCreateInfo vertexInputState =
996 vk::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
998 (vk::VkPipelineVertexInputStateCreateFlags)0,
1004 const vk::VkPipelineInputAssemblyStateCreateInfo iaState =
1006 vk::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
1008 (vk::VkPipelineInputAssemblyStateCreateFlags)0,
1012 const vk::VkPipelineTessellationStateCreateInfo tessState =
1014 vk::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
1016 (vk::VkPipelineTessellationStateCreateFlags)0,
1019 const vk::VkViewport viewport =
1028 const vk::VkRect2D renderArea =
1033 const vk::VkPipelineViewportStateCreateInfo vpState =
1035 vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
1037 (vk::VkPipelineViewportStateCreateFlags)0,
1043 const vk::VkPipelineRasterizationStateCreateInfo rsState =
1045 vk::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
1047 (vk::VkPipelineRasterizationStateCreateFlags)0,
1050 vk::VK_POLYGON_MODE_FILL, // fillMode
1051 vk::VK_CULL_MODE_NONE, // cullMode
1052 vk::VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace
1059 const vk::VkSampleMask sampleMask = 0x01u;
1060 const vk::VkPipelineMultisampleStateCreateInfo msState =
1062 vk::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
1064 (vk::VkPipelineMultisampleStateCreateFlags)0,
1065 vk::VK_SAMPLE_COUNT_1_BIT, // rasterSamples
1072 const vk::VkPipelineDepthStencilStateCreateInfo dsState =
1074 vk::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
1076 (vk::VkPipelineDepthStencilStateCreateFlags)0,
1079 vk::VK_COMPARE_OP_ALWAYS, // depthCompareOp
1082 { vk::VK_STENCIL_OP_KEEP, vk::VK_STENCIL_OP_KEEP, vk::VK_STENCIL_OP_KEEP, vk::VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u }, // front
1083 { vk::VK_STENCIL_OP_KEEP, vk::VK_STENCIL_OP_KEEP, vk::VK_STENCIL_OP_KEEP, vk::VK_COMPARE_OP_ALWAYS, 0u, 0u, 0u }, // back
1087 const vk::VkPipelineColorBlendAttachmentState cbAttachment =
1090 vk::VK_BLEND_FACTOR_ZERO, // srcBlendColor
1091 vk::VK_BLEND_FACTOR_ZERO, // destBlendColor
1092 vk::VK_BLEND_OP_ADD, // blendOpColor
1093 vk::VK_BLEND_FACTOR_ZERO, // srcBlendAlpha
1094 vk::VK_BLEND_FACTOR_ZERO, // destBlendAlpha
1095 vk::VK_BLEND_OP_ADD, // blendOpAlpha
1096 (vk::VK_COLOR_COMPONENT_R_BIT |
1097 vk::VK_COLOR_COMPONENT_G_BIT |
1098 vk::VK_COLOR_COMPONENT_B_BIT |
1099 vk::VK_COLOR_COMPONENT_A_BIT), // channelWriteMask
1101 const vk::VkPipelineColorBlendStateCreateInfo cbState =
1103 vk::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
1105 (vk::VkPipelineColorBlendStateCreateFlags)0,
1107 vk::VK_LOGIC_OP_CLEAR, // logicOp
1112 const vk::VkGraphicsPipelineCreateInfo createInfo =
1114 vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
1116 (vk::VkPipelineCreateFlags)0,
1127 (const vk::VkPipelineDynamicStateCreateInfo*)DE_NULL, // pDynamicState
1131 (vk::VkPipeline)0, // basePipelineHandle
1134 return createGraphicsPipeline(m_vki, m_device, (vk::VkPipelineCache)0u, &createInfo);
1139 const vk::VkRect2D renderArea =
1144 const vk::VkCommandBufferBeginInfo mainCmdBufBeginInfo =
1146 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1148 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
1149 (const vk::VkCommandBufferInheritanceInfo*)DE_NULL,
1151 const vk::VkCommandBufferInheritanceInfo passCmdBufInheritInfo =
1153 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1155 (vk::VkRenderPass)*m_renderPass, // renderPass
1157 (vk::VkFramebuffer)*m_framebuffer, // framebuffer
1159 (vk::VkQueryControlFlags)0,
1160 (vk::VkQueryPipelineStatisticFlags)0,
1162 const vk::VkCommandBufferBeginInfo passCmdBufBeginInfo =
1164 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1166 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT |
1167 vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, // flags
1170 const vk::VkClearValue clearValue = vk::makeClearValueColorF32(0.0f, 0.0f, 0.0f, 0.0f);
1171 const vk::VkRenderPassBeginInfo renderPassBeginInfo =
1173 vk::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
1182 const vk::VkPipelineLayout pipelineLayout (getPipelineLayout());
1183 const vk::Unique<vk::VkPipeline> pipeline (createPipeline(pipelineLayout));
1184 const vk::Unique<vk::VkCommandBuffer> mainCmd (vk::allocateCommandBuffer(m_vki, m_device, *m_cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
1185 const vk::Unique<vk::VkCommandBuffer> passCmd ((m_isPrimaryCmdBuf) ? (vk::Move<vk::VkCommandBuffer>()) : (vk::allocateCommandBuffer(m_vki, m_device, *m_cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_SECONDARY)));
1186 const vk::Unique<vk::VkFence> fence (vk::createFence(m_vki, m_device));
1188 const vk::VkSubpassContents passContents = (m_isPrimaryCmdBuf) ? (vk::VK_SUBPASS_CONTENTS_INLINE) : (vk::VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
1195 m_vki.cmdBindPipeline(*mainCmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1201 m_vki.cmdBindPipeline(*passCmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
1213 const vk::VkSubmitInfo submitInfo =
1215 vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
1218 (const vk::VkSemaphore*)0,
1219 (const vk::VkPipelineStageFlags*)DE_NULL,
1223 (const vk::VkSemaphore*)0,
1263 vk::VkDescriptorType descriptorType,
1264 vk::VkShaderStageFlags stageFlags,
1270 static vk::Move<vk::VkBuffer> createSourceBuffer (const vk::DeviceInterface& vki,
1271 vk::VkDevice device,
1272 vk::Allocator& allocator,
1273 vk::VkDescriptorType descriptorType,
1276 de::MovePtr<vk::Allocation>* outMemory);
1278 static vk::Move<vk::VkDescriptorPool> createDescriptorPool (const vk::DeviceInterface& vki,
1279 vk::VkDevice device,
1280 vk::VkDescriptorType descriptorType,
1283 static vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (const vk::DeviceInterface& vki,
1284 vk::VkDevice device,
1285 vk::VkDescriptorType descriptorType,
1287 vk::VkShaderStageFlags stageFlags,
1290 static vk::Move<vk::VkDescriptorSet> createDescriptorSet (const vk::DeviceInterface& vki,
1292 vk::VkDevice device,
1293 vk::VkDescriptorSetLayout descriptorSetLayout,
1294 vk::VkDescriptorPool descriptorPool,
1295 vk::VkDescriptorType descriptorType,
1297 vk::VkBuffer sourceBufferA,
1299 vk::VkBuffer sourceBufferB,
1301 vk::DescriptorSetUpdateBuilder& updateBuilder,
1302 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
1304 vk::VkPipelineLayout pipelineLayout = DE_NULL);
1306 static vk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface& vki,
1307 vk::VkDevice device,
1308 vk::VkDescriptorSetLayout descriptorSetLayout);
1310 static void writeDescriptorSet (const vk::DeviceInterface& vki,
1311 vk::VkDevice device,
1312 vk::VkDescriptorSetLayout descriptorSetLayout,
1313 vk::VkDescriptorPool descriptorPool,
1314 vk::VkDescriptorType descriptorType,
1316 vk::VkBuffer sourceBufferA,
1318 vk::VkBuffer sourceBufferB,
1320 vk::VkDescriptorSet descriptorSet,
1321 vk::DescriptorSetUpdateBuilder& updateBuilder,
1324 static void writeDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
1325 vk::VkDevice device,
1326 vk::VkDescriptorSetLayout descriptorSetLayout,
1327 vk::VkDescriptorPool descriptorPool,
1328 vk::VkDescriptorType descriptorType,
1330 vk::VkBuffer sourceBufferA,
1332 vk::VkBuffer sourceBufferB,
1334 vk::VkDescriptorSet descriptorSet,
1335 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
1338 vk::VkPipelineLayout pipelineLayout = 0);
1341 vk::VkPipelineLayout getPipelineLayout (void) const;
1342 void writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const;
1359 const vk::VkDescriptorType m_descriptorType;
1364 const vk::VkShaderStageFlags m_stageFlags;
1375 de::MovePtr<vk::Allocation> m_bufferMemoryA;
1376 de::MovePtr<vk::Allocation> m_bufferMemoryB;
1377 const vk::Unique<vk::VkBuffer> m_sourceBufferA;
1378 const vk::Unique<vk::VkBuffer> m_sourceBufferB;
1379 const vk::Unique<vk::VkDescriptorPool> m_descriptorPool;
1380 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
1382 vk::DescriptorSetUpdateBuilder m_updateBuilder;
1383 const vk::Unique<vk::VkDescriptorSetLayout> m_descriptorSetLayout;
1384 const vk::Unique<vk::VkPipelineLayout> m_pipelineLayout;
1385 const vk::Unique<vk::VkDescriptorSet> m_descriptorSet;
1391 vk::VkDescriptorType descriptorType,
1392 vk::VkShaderStageFlags stageFlags,
1417 ? vk::Move<vk::VkBuffer>()
1433 vk::Move<vk::VkBuffer> BufferRenderInstance::createSourceBuffer (const vk::DeviceInterface& vki,
1434 vk::VkDevice device,
1435 vk::Allocator& allocator,
1436 vk::VkDescriptorType descriptorType,
1439 de::MovePtr<vk::Allocation>* outMemory)
1452 const vk::VkBufferUsageFlags usageFlags = (isUniformBuffer) ? (vk::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) : (vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
1455 const vk::VkBufferCreateInfo bufferCreateInfo =
1457 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1462 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
1466 vk::Move<vk::VkBuffer> buffer (vk::createBuffer(vki, device, &bufferCreateInfo));
1467 de::MovePtr<vk::Allocation> bufferMemory = allocateAndBindObjectMemory(vki, device, allocator, *buffer, vk::MemoryRequirement::HostVisible);
1487 vk::Move<vk::VkDescriptorPool> BufferRenderInstance::createDescriptorPool (const vk::DeviceInterface& vki,
1488 vk::VkDevice device,
1489 vk::VkDescriptorType descriptorType,
1492 return vk::DescriptorPoolBuilder()
1494 .build(vki, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
1497 vk::Move<vk::VkDescriptorSetLayout> BufferRenderInstance::createDescriptorSetLayout (const vk::DeviceInterface& vki,
1498 vk::VkDevice device,
1499 vk::VkDescriptorType descriptorType,
1501 vk::VkShaderStageFlags stageFlags,
1504 vk::DescriptorSetLayoutBuilder builder;
1505 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
1510 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
1540 vk::Move<vk::VkDescriptorSet> BufferRenderInstance::createDescriptorSet (const vk::DeviceInterface& vki,
1542 vk::VkDevice device,
1543 vk::VkDescriptorSetLayout descriptorSetLayout,
1544 vk::VkDescriptorPool descriptorPool,
1545 vk::VkDescriptorType descriptorType,
1547 vk::VkBuffer bufferA,
1549 vk::VkBuffer bufferB,
1551 vk::DescriptorSetUpdateBuilder& updateBuilder,
1552 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
1554 vk::VkPipelineLayout pipelineLayout)
1556 const vk::VkDescriptorSetAllocateInfo allocInfo =
1558 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
1565 vk::Move<vk::VkDescriptorSet> descriptorSet;
1572 descriptorSet = vk::Move<vk::VkDescriptorSet>();
1595 void BufferRenderInstance::writeDescriptorSet (const vk::DeviceInterface& vki,
1596 vk::VkDevice device,
1597 vk::VkDescriptorSetLayout descriptorSetLayout,
1598 vk::VkDescriptorPool descriptorPool,
1599 vk::VkDescriptorType descriptorType,
1601 vk::VkBuffer bufferA,
1603 vk::VkBuffer bufferB,
1605 vk::VkDescriptorSet descriptorSet,
1606 vk::DescriptorSetUpdateBuilder& updateBuilder,
1611 const vk::VkDescriptorBufferInfo bufferInfos[2] =
1613 vk::makeDescriptorBufferInfo(bufferA, (vk::VkDeviceSize)offsetA, (vk::VkDeviceSize)BUFFER_DATA_SIZE),
1614 vk::makeDescriptorBufferInfo(bufferB, (vk::VkDeviceSize)offsetB, (vk::VkDeviceSize)BUFFER_DATA_SIZE),
1620 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &bufferInfos[0]);
1624 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &bufferInfos[0]);
1625 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), descriptorType, &bufferInfos[1]);
1629 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0x7FFEu), descriptorType, &bufferInfos[0]);
1630 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0xFFFEu), descriptorType, &bufferInfos[1]);
1634 updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, 2u, bufferInfos);
1647 void BufferRenderInstance::writeDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
1648 vk::VkDevice device,
1649 vk::VkDescriptorSetLayout layout,
1650 vk::VkDescriptorPool descriptorPool,
1651 vk::VkDescriptorType descriptorType,
1653 vk::VkBuffer bufferA,
1655 vk::VkBuffer bufferB,
1657 vk::VkDescriptorSet descriptorSet,
1658 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
1661 vk::VkPipelineLayout pipelineLayout)
1664 const vk::VkDescriptorBufferInfo bufferInfos[2] =
1666 vk::makeDescriptorBufferInfo(bufferA, (vk::VkDeviceSize)offsetA, (vk::VkDeviceSize)BUFFER_DATA_SIZE),
1667 vkvk::VkDeviceSize)offsetB, (vk::VkDeviceSize)BUFFER_DATA_SIZE),
1669 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
1670 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
1672 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
1677 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
1679 vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
1713 updateTemplate = vk::createDescriptorUpdateTemplate(vki, device, &templateCreateInfo);
1721 vk::Move<vk::VkPipelineLayout> BufferRenderInstance::createPipelineLayout (const vk::DeviceInterface& vki,
1722 vk::VkDevice device,
1723 vk::VkDescriptorSetLayout descriptorSetLayout)
1725 const vk::VkPipelineLayoutCreateInfo createInfo =
1727 vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1729 (vk::VkPipelineLayoutCreateFlags)0,
1736 return vk::createPipelineLayout(vki, device, &createInfo);
1750 << " descriptor(s) of type " << vk::getDescriptorTypeName(m_descriptorType) << "\n"
1773 << (((m_stageFlags & vk::VK_SHADER_STAGE_VERTEX_BIT) != 0) ? (" vertex") : (""))
1774 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0) ? (" tess_control") : (""))
1775 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0) ? (" tess_evaluation") : (""))
1776 << (((m_stageFlags & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0) ? (" geometry") : (""))
1777 << (((m_stageFlags & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0) ? (" fragment") : (""))
1787 vk::VkPipelineLayout BufferRenderInstance::getPipelineLayout (void) const
1792 void BufferRenderInstance::writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const
1805 m_vki.cmdBindDescriptorSets(cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, getPipelineLayout(), 0, 1, &m_descriptorSet.get(), numOffsets, dynamicOffsetPtr);
1813 m_updateBuilder.updateWithPush(m_vki, cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0);
1841 ComputeInstanceResultBuffer (const vk::DeviceInterface& vki,
1842 vk::VkDevice device,
1843 vk::Allocator& allocator);
1847 inline vk::VkBuffer getBuffer (void) const { return *m_buffer; }
1848 inline const vk::VkBufferMemoryBarrier* getResultReadBarrier (void) const { return &m_bufferBarrier; }
1851 static vk::Move<vk::VkBuffer> createResultBuffer (const vk::DeviceInterface& vki,
1852 vk::VkDevice device,
1853 vk::Allocator& allocator,
1854 de::MovePtr<vk::Allocation>* outAllocation);
1856 static vk::VkBufferMemoryBarrier createResultBufferBarrier (vk::VkBuffer buffer);
1858 const vk::DeviceInterface& m_vki;
1859 const vk::VkDevice m_device;
1861 de::MovePtr<vk::Allocation> m_bufferMem;
1862 const vk::Unique<vk::VkBuffer> m_buffer;
1863 const vk::VkBufferMemoryBarrier m_bufferBarrier;
1866 ComputeInstanceResultBuffer::ComputeInstanceResultBuffer (const vk::DeviceInterface& vki,
1867 vk::VkDevice device,
1868 vk::Allocator& allocator)
1883 vk::Move<vk::VkBuffer> ComputeInstanceResultBuffer::createResultBuffer (const vk::DeviceInterface& vki,
1884 vk::VkDevice device,
1885 vk::Allocator& allocator,
1886 de::MovePtr<vk::Allocation>* outAllocation)
1888 const vk::VkBufferCreateInfo createInfo =
1890 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1893 (vk::VkDeviceSize)DATA_SIZE, // size
1894 vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, // usage
1895 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
1899 vk::Move<vk::VkBuffer> buffer (vk::createBuffer(vki, device, &createInfo));
1900 de::MovePtr<vk::Allocation> allocation (allocateAndBindObjectMemory(vki, device, allocator, *buffer, vk::MemoryRequirement::HostVisible));
1907 flushMappedMemoryRange(vki, device, allocation->getMemory(), allocation->getOffset(), (vk::VkDeviceSize)DATA_SIZE);
1913 vk::VkBufferMemoryBarrier ComputeInstanceResultBuffer::createResultBufferBarrier (vk::VkBuffer buffer)
1915 const vk::VkBufferMemoryBarrier bufferBarrier =
1917 vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
1919 vk::VK_ACCESS_SHADER_WRITE_BIT, // outputMask
1920 vk::VK_ACCESS_HOST_READ_BIT, // inputMask
1924 (vk::VkDeviceSize)0u, // offset
1933 ComputePipeline (const vk::DeviceInterface& vki,
1934 vk::VkDevice device,
1935 const vk::BinaryCollection& programCollection,
1937 const vk::VkDescriptorSetLayout* descriptorSetLayouts);
1939 inline vk::VkPipeline getPipeline (void) const { return *m_pipeline; };
1940 inline vk::VkPipelineLayout getPipelineLayout (void) const { return *m_pipelineLayout; };
1943 static vk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface& vki,
1944 vk::VkDevice device,
1946 const vk::VkDescriptorSetLayout* descriptorSetLayouts);
1948 static vk::Move<vk::VkPipeline> createPipeline (const vk::DeviceInterface& vki,
1949 vk::VkDevice device,
1950 const vk::BinaryCollection& programCollection,
1951 vk::VkPipelineLayout layout);
1953 const vk::Unique<vk::VkPipelineLayout> m_pipelineLayout;
1954 const vk::Unique<vk::VkPipeline> m_pipeline;
1957 ComputePipeline::ComputePipeline (const vk::DeviceInterface& vki,
1958 vk::VkDevice device,
1959 const vk::BinaryCollection& programCollection,
1961 const vk::VkDescriptorSetLayout* descriptorSetLayouts)
1967 vk::Move<vk::VkPipelineLayout> ComputePipeline::createPipelineLayout (const vk::DeviceInterface& vki,
1968 vk::VkDevice device,
1970 const vk::VkDescriptorSetLayout* descriptorSetLayouts)
1972 const vk::VkPipelineLayoutCreateInfo createInfo =
1974 vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1976 (vk::VkPipelineLayoutCreateFlags)0,
1982 return vk::createPipelineLayout(vki, device, &createInfo);
1985 vk::Move<vk::VkPipeline> ComputePipeline::createPipeline (const vk::DeviceInterface& vki,
1986 vk::VkDevice device,
1987 const vk::BinaryCollection& programCollection,
1988 vk::VkPipelineLayout layout)
1990 const vk::Unique<vk::VkShaderModule> computeModule (vk::createShaderModule(vki, device, programCollection.get("compute"), (vk::VkShaderModuleCreateFlags)0u));
1991 const vk::VkPipelineShaderStageCreateInfo cs =
1993 vk::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
1995 (vk::VkPipelineShaderStageCreateFlags)0,
1996 vk::VK_SHADER_STAGE_COMPUTE_BIT, // stage
2001 const vk::VkComputePipelineCreateInfo createInfo =
2003 vk::VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2008 (vk::VkPipeline)0, // basePipelineHandle
2011 return createComputePipeline(vki, device, (vk::VkPipelineCache)0u, &createInfo);
2017 ComputeCommand (const vk::DeviceInterface& vki,
2018 vk::VkDevice device,
2019 vk::VkPipeline pipeline,
2020 vk::VkPipelineLayout pipelineLayout,
2023 const vk::VkDescriptorSet* descriptorSets,
2027 const vk::VkBufferMemoryBarrier* preBarriers,
2029 const vk::VkBufferMemoryBarrier* postBarriers);
2031 void submitAndWait (deUint32 queueFamilyIndex, vk::VkQueue queue, vk::VkDescriptorUpdateTemplate updateTemplate = DE_NULL, const void *rawUpdateData = 0) const;
2032 void submitAndWait (deUint32 queueFamilyIndex, vk::VkQueue queue, vk::DescriptorSetUpdateBuilder& updateBuilder) const;
2035 const vk::DeviceInterface& m_vki;
2036 const vk::VkDevice m_device;
2037 const vk::VkPipeline m_pipeline;
2038 const vk::VkPipelineLayout m_pipelineLayout;
2041 const vk::VkDescriptorSet* const m_descriptorSets;
2045 const vk::VkBufferMemoryBarrier* const m_preBarriers;
2047 const vk::VkBufferMemoryBarrier* const m_postBarriers;
2050 ComputeCommand::ComputeCommand (const vk::DeviceInterface& vki,
2051 vk::VkDevice device,
2052 vk::VkPipeline pipeline,
2053 vk::VkPipelineLayout pipelineLayout,
2056 const vk::VkDescriptorSet* descriptorSets,
2060 const vk::VkBufferMemoryBarrier* preBarriers,
2062 const vk::VkBufferMemoryBarrier* postBarriers)
2079 void ComputeCommand::submitAndWait (deUint32 queueFamilyIndex, vk::VkQueue queue, vk::VkDescriptorUpdateTemplate updateTemplate, const void *rawUpdateData) const
2081 const vk::VkCommandPoolCreateInfo cmdPoolCreateInfo =
2083 vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
2085 vk::VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags
2088 const vk::Unique<vk::VkCommandPool> cmdPool (vk::createCommandPool(m_vki, m_device, &cmdPoolCreateInfo));
2090 const vk::VkFenceCreateInfo fenceCreateInfo =
2092 vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
2097 const vk::VkCommandBufferAllocateInfo cmdBufCreateInfo =
2099 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
2102 vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level
2105 const vk::VkCommandBufferBeginInfo cmdBufBeginInfo =
2107 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2109 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
2110 (const vk::VkCommandBufferInheritanceInfo*)DE_NULL,
2113 const vk::Unique<vk::VkFence> cmdCompleteFence (vk::createFence(m_vki, m_device, &fenceCreateInfo));
2114 const vk::Unique<vk::VkCommandBuffer> cmd (vk::allocateCommandBuffer(m_vki, m_device, &cmdBufCreateInfo));
2119 m_vki.cmdBindPipeline(*cmd, vk::VK_PIPELINE_BIND_POINT_COMPUTE, m_pipeline);
2123 m_vki.cmdBindDescriptorSets(*cmd, vk::VK_PIPELINE_BIND_POINT_COMPUTE, m_pipelineLayout, 0, m_numDescriptorSets, m_descriptorSets, m_numDynamicOffsets, m_dynamicOffsets);
2133 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (vk::VkDependencyFlags)0,
2134 0, (const vk::VkMemoryBarrier*)DE_NULL,
2136 0, (const vk::VkImageMemoryBarrier*)DE_NULL);
2139 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (vk::VkDependencyFlags)0,
2140 0, (const vk::VkMemoryBarrier*)DE_NULL,
2142 0, (const vk::VkImageMemoryBarrier*)DE_NULL);
2147 const vk::VkSubmitInfo submitInfo =
2149 vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
2152 (const vk::VkSemaphore*)0,
2153 (const vk::VkPipelineStageFlags*)DE_NULL,
2157 (const vk::VkSemaphore*)0,
2165 void ComputeCommand::submitAndWait (deUint32 queueFamilyIndex, vk::VkQueue queue, vk::DescriptorSetUpdateBuilder& updateBuilder) const
2167 const vk::VkCommandPoolCreateInfo cmdPoolCreateInfo =
2169 vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
2171 vk::VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags
2174 const vk::Unique<vk::VkCommandPool> cmdPool (vk::createCommandPool(m_vki, m_device, &cmdPoolCreateInfo));
2175 const vk::VkCommandBufferBeginInfo cmdBufBeginInfo =
2177 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
2179 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
2180 (const vk::VkCommandBufferInheritanceInfo*)DE_NULL,
2183 const vk::Unique<vk::VkFence> cmdCompleteFence (vk::createFence(m_vki, m_device));
2184 const vk::Unique<vk::VkCommandBuffer> cmd (vk::allocateCommandBuffer(m_vki, m_device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
2189 m_vki.cmdBindPipeline(*cmd, vk::VK_PIPELINE_BIND_POINT_COMPUTE, m_pipeline);
2193 m_vki.cmdBindDescriptorSets(*cmd, vk::VK_PIPELINE_BIND_POINT_COMPUTE, m_pipelineLayout, 0, m_numDescriptorSets, m_descriptorSets, m_numDynamicOffsets, m_dynamicOffsets);
2196 updateBuilder.updateWithPush(m_vki, *cmd, vk::VK_PIPELINE_BIND_POINT_COMPUTE, m_pipelineLayout, 0);
2199 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (vk::VkDependencyFlags)0,
2200 0, (const vk::VkMemoryBarrier*)DE_NULL,
2202 0, (const vk::VkImageMemoryBarrier*)DE_NULL);
2205 m_vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (vk::VkDependencyFlags)0,
2206 0, (const vk::VkMemoryBarrier*)DE_NULL,
2208 0, (const vk::VkImageMemoryBarrier*)DE_NULL);
2213 const vk::VkSubmitInfo submitInfo =
2215 vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
2218 (const vk::VkSemaphore*)0,
2219 (const vk::VkPipelineStageFlags*)DE_NULL,
2223 (const vk::VkSemaphore*)0,
2235 vk::VkDescriptorType descriptorType,
2242 vk::Move<vk::VkBuffer> createColorDataBuffer (deUint32 offset, deUint32 bufferSize, const tcu::Vec4& value1, const tcu::Vec4& value2, de::MovePtr<vk::Allocation>* outAllocation);
2243 vk::Move<vk::VkBufferView> createBufferView (vk::VkBuffer buffer, deUint32 offset) const;
2244 vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (void) const;
2245 vk::Move<vk::VkDescriptorPool> createDescriptorPool (void) const;
2246 vk::Move<vk::VkDescriptorSet> createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout, vk::VkBuffer viewA, deUint32 offsetA, vk::VkBuffer viewB, deUint32 offsetB, vk::VkBuffer resBuf);
2247 void writeDescriptorSet (vk::VkDescriptorSet descriptorSet, vk::VkBuffer viewA, deUint32 offsetA, vk::VkBuffer viewB, deUint32 offsetB, vk::VkBuffer resBuf);
2248 void writeDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, vk::VkBuffer viewA, deUint32 offsetA, vk::VkBuffer viewB, deUint32 offsetB, vk::VkBuffer resBuf, bool withPush = false, vk::VkPipelineLayout pipelineLayout = DE_NULL);
2263 const vk::VkDescriptorType m_descriptorType;
2269 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
2270 const vk::DeviceInterface& m_vki;
2271 const vk::VkDevice m_device;
2272 const vk::VkQueue m_queue;
2274 vk::Allocator& m_allocator;
2279 vk::DescriptorSetUpdateBuilder m_updateBuilder;
2284 vk::VkDescriptorType descriptorType,
2310 vk::Move<vk::VkBuffer> BufferComputeInstance::createColorDataBuffer (deUint32 offset, deUint32 bufferSize, const tcu::Vec4& value1, const tcu::Vec4& value2, de::MovePtr<vk::Allocation>* outAllocation)
2315 const vk::VkBufferUsageFlags usageFlags = (isUniformBuffer) ? (vk::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) : (vk::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
2316 const vk::VkBufferCreateInfo createInfo =
2318 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
2321 (vk::VkDeviceSize)bufferSize, // size
2323 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
2327 vk::Move<vk::VkBuffer> buffer (vk::createBuffer(m_vki, m_device, &createInfo));
2328 de::MovePtr<vk::Allocation> allocation (allocateAndBindObjectMemory(m_vki, m_device, m_allocator, *buffer, vk::MemoryRequirement::HostVisible));
2343 vk::Move<vk::VkDescriptorSetLayout> BufferComputeInstance::createDescriptorSetLayout (void) const
2345 vk::DescriptorSetLayoutBuilder builder;
2346 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
2351 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
2354 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT);
2359 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
2363 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
2364 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
2368 builder.addSingleIndexedBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT, 0x7FFEu);
2369 builder.addSingleIndexedBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT, 0xFFFEu);
2373 builder.addArrayBinding(m_descriptorType, 2u, vk::VK_SHADER_STAGE_COMPUTE_BIT);
2383 vk::Move<vk::VkDescriptorPool> BufferComputeInstance::createDescriptorPool (void) const
2385 return vk::DescriptorPoolBuilder()
2386 .addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
2388 .build(m_vki, m_device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
2391 vk::Move<vk::VkDescriptorSet> BufferComputeInstance::createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout, vk::VkBuffer viewA, deUint32 offsetA, vk::VkBuffer viewB, deUint32 offsetB, vk::VkBuffer resBuf)
2393 const vk::VkDescriptorSetAllocateInfo allocInfo =
2395 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2402 vk::Move<vk::VkDescriptorSet> descriptorSet;
2409 descriptorSet = vk::Move<vk::VkDescriptorSet>();
2424 void BufferComputeInstance::writeDescriptorSet (vk::VkDescriptorSet descriptorSet, vk::VkBuffer viewA, deUint32 offsetA, vk::VkBuffer viewB, deUint32 offsetB, vk::VkBuffer resBuf)
2426 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(resBuf, 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
2427 const vk::VkDescriptorBufferInfo bufferInfos[2] =
2429 vk::makeDescriptorBufferInfo(viewA, (vk::VkDeviceSize)offsetA, (vk::VkDeviceSize)sizeof(tcu::Vec4[2])),
2430 vk::makeDescriptorBufferInfo(viewB, (vk::VkDeviceSize)offsetB, (vk::VkDeviceSize)sizeof(tcu::Vec4[2])),
2434 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo);
2440 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, &bufferInfos[0]);
2444 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, &bufferInfos[0]);
2445 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), m_descriptorType, &bufferInfos[1]);
2449 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0x7FFEu), m_descriptorType, &bufferInfos[0]);
2450 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0xFFFEu), m_descriptorType, &bufferInfos[1]);
2454 m_updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, 2u, bufferInfos);
2467 void BufferComputeInstance::writeDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, vk::VkBuffer viewA, deUint32 offsetA, vk::VkBuffer viewB, deUint32 offsetB, vk::VkBuffer resBuf, bool withPush, vk::VkPipelineLayout pipelineLayout)
2469 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(resBuf, 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
2470 const vk::VkDescriptorBufferInfo bufferInfos[2] =
2472 vk::makeDescriptorBufferInfo(viewA, (vk::VkDeviceSize)offsetA, (vk::VkDeviceSize)sizeof(tcu::Vec4[2])),
2473 vk::makeDescriptorBufferInfo(viewB, (vk::VkDeviceSize)offsetB, (vk::VkDeviceSize)sizeof(tcu::Vec4[2])),
2475 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
2476 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
2478 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
2483 withPush ? vkvk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
2485 vk::VK_PIPELINE_BIND_POINT_COMPUTE,
2494 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, m_updateRegistry.getWriteObjectOffset(0), 0));
2524 m_updateTemplate = vk::createDescriptorUpdateTemplate(m_vki, m_device, &templateCreateInfo);
2549 << " source descriptor(s) of type " << vk::getDescriptorTypeName(m_descriptorType)
2601 de::MovePtr<vk::Allocation> bufferMemA;
2602 const vk::Unique<vk::VkBuffer> bufferA (createColorDataBuffer(dataOffsetA, bufferSizeA, colorA1, colorA2, &bufferMemA));
2604 de::MovePtr<vk::Allocation> bufferMemB;
2605 const vk::Unique<vk::VkBuffer> bufferB ((getInterfaceNumResources(m_shaderInterface) == 1u)
2606 ? (vk::Move<vk::VkBuffer>())
2609 const vk::Unique<vk::VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout());
2610 const vk::Unique<vk::VkDescriptorPool> descriptorPool (createDescriptorPool());
2611 const vk::Unique<vk::VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout, *bufferA, viewOffsetA, *bufferB, viewOffsetB, m_result.getBuffer()));
2614 const vk::VkAccessFlags inputBit = (isUniformBuffer) ? (vk::VK_ACCESS_UNIFORM_READ_BIT) : (vk::VK_ACCESS_SHADER_READ_BIT);
2615 const vk::VkBufferMemoryBarrier bufferBarriers[] =
2618 vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2620 vk::VK_ACCESS_HOST_WRITE_BIT, // outputMask
2625 (vk::VkDeviceSize)0u, // offset
2626 (vk::VkDeviceSize)bufferSizeA, // size
2629 vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
2631 vk::VK_ACCESS_HOST_WRITE_BIT, // outputMask
2636 (vk::VkDeviceSize)0u, // offset
2637 (vk::VkDeviceSize)bufferSizeB, // size
2643 const vk::VkDescriptorSet descriptorSets[] = { *descriptorSet };
2647 const vk::VkBufferMemoryBarrier* const preBarriers = bufferBarriers;
2649 const vk::VkBufferMemoryBarrier* const postBarriers = m_result.getResultReadBarrier();
2741 vk::VkShaderStageFlags exitingStages,
2742 vk::VkShaderStageFlags activeStages);
2744 virtual std::string genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const = 0;
2745 virtual std::string genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const = 0;
2746 virtual std::string genResourceAccessSource (vk::VkShaderStageFlagBits stage) const = 0;
2756 void initPrograms (vk::SourceCollections& programCollection) const;
2760 const vk::VkShaderStageFlags m_exitingStages;
2761 const vk::VkShaderStageFlags m_activeStages;
2768 vk::VkShaderStageFlags exitingStages,
2769 vk::VkShaderStageFlags activeStages)
2780 const char* const nextStageName = ((m_exitingStages & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0u) ? ("tsc")
2781 : ((m_exitingStages & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0u) ? ("geo")
2782 : ((m_exitingStages & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0u) ? ("frag")
2784 const char* const fragColorPrec = ((m_exitingStages & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0) ? "highp" : "mediump";
2788 if ((m_activeStages & vk::VK_SHADER_STAGE_VERTEX_BIT) != 0u)
2790 const bool onlyVS = (m_activeStages == vk::VK_SHADER_STAGE_VERTEX_BIT);
2794 << genExtensionDeclarations(vk::VK_SHADER_STAGE_VERTEX_BIT)
2795 << genResourceDeclarations(vk::VK_SHADER_STAGE_VERTEX_BIT, 0)
2798 << genPerVertexBlock(vk::VK_SHADER_STAGE_VERTEX_BIT, m_glslVersion)
2808 << genResourceAccessSource(vk::VK_SHADER_STAGE_VERTEX_BIT)
2816 << genExtensionDeclarations(vk::VK_SHADER_STAGE_VERTEX_BIT)
2818 << genPerVertexBlock(vk::VK_SHADER_STAGE_VERTEX_BIT, m_glslVersion)
2839 if ((m_activeStages & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0u)
2842 DE_ASSERT(m_activeStages == vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
2847 << genExtensionDeclarations(vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
2849 << genResourceDeclarations(vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0)
2852 << genPerVertexBlock(vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, m_glslVersion)
2857 << genResourceAccessSource(vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)
2878 else if ((m_activeStages & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0u)
2886 << genPerVertexBlock(vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, m_glslVersion)
2924 if ((m_activeStages & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0u)
2927 DE_ASSERT(m_activeStages == vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
2932 << genExtensionDeclarations(vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
2934 << genResourceDeclarations(vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, 0)
2937 << genPerVertexBlock(vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, m_glslVersion)
2942 << genResourceAccessSource(vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
2948 else if ((m_activeStages & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0u)
2951 DE_ASSERT(m_activeStages == vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
2959 << genPerVertexBlock(vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, m_glslVersion)
2982 if ((m_activeStages & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0u)
2985 DE_ASSERT(m_activeStages == vk::VK_SHADER_STAGE_GEOMETRY_BIT);
2990 << genExtensionDeclarations(vk::VK_SHADER_STAGE_GEOMETRY_BIT)
2993 << genResourceDeclarations(vk::VK_SHADER_STAGE_GEOMETRY_BIT, 0)
2996 << genPerVertexBlock(vk::VK_SHADER_STAGE_GEOMETRY_BIT, m_glslVersion)
3003 << genResourceAccessSource(vk::VK_SHADER_STAGE_GEOMETRY_BIT)
3009 << genResourceAccessSource(vk::VK_SHADER_STAGE_GEOMETRY_BIT)
3015 << genResourceAccessSource(vk::VK_SHADER_STAGE_GEOMETRY_BIT)
3021 << genResourceAccessSource(vk::VK_SHADER_STAGE_GEOMETRY_BIT)
3041 if ((m_activeStages & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0u)
3044 << genExtensionDeclarations(vk::VK_SHADER_STAGE_GEOMETRY_BIT)
3045 << genResourceDeclarations(vk::VK_SHADER_STAGE_FRAGMENT_BIT, 0);
3047 if (m_activeStages != vk::VK_SHADER_STAGE_FRAGMENT_BIT)
3059 << genResourceAccessSource(vk::VK_SHADER_STAGE_FRAGMENT_BIT);
3061 if (m_activeStages != vk::VK_SHADER_STAGE_FRAGMENT_BIT)
3109 << genExtensionDeclarations(vk::VK_SHADER_STAGE_COMPUTE_BIT)
3111 << genResourceDeclarations(vk::VK_SHADER_STAGE_COMPUTE_BIT, 1)
3120 << genResourceAccessSource(vk::VK_SHADER_STAGE_COMPUTE_BIT)
3127 void QuadrantRendederCase::initPrograms (vk::SourceCollections& programCollection) const
3129 if ((m_exitingStages & vk::VK_SHADER_STAGE_VERTEX_BIT) != 0u)
3132 if ((m_exitingStages & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0u)
3135 if ((m_exitingStages & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0u)
3138 if ((m_exitingStages & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0u)
3141 if ((m_exitingStages & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0u)
3144 if ((m_exitingStages & vk::VK_SHADER_STAGE_COMPUTE_BIT) != 0u)
3165 vk::VkDescriptorType descriptorType,
3166 vk::VkShaderStageFlags exitingStages,
3167 vk::VkShaderStageFlags activeStages,
3172 std::string genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const;
3173 std::string genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const;
3174 std::string genResourceAccessSource (vk::VkShaderStageFlagBits stage) const;
3184 const vk::VkDescriptorType m_descriptorType;
3193 vk::VkDescriptorType descriptorType,
3194 vk::VkShaderStageFlags exitingStages,
3195 vk::VkShaderStageFlags activeStages,
3209 std::string BufferDescriptorCase::genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const
3215 std::string BufferDescriptorCase::genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const
3274 std::string BufferDescriptorCase::genResourceAccessSource (vk::VkShaderStageFlagBits stage) const
3329 if (m_exitingStages == vk::VK_SHADER_STAGE_COMPUTE_BIT)
3341 ImageInstanceImages (const vk::DeviceInterface& vki,
3342 vk::VkDevice device,
3344 vk::VkQueue queue,
3345 vk::Allocator& allocator,
3346 vk::VkDescriptorType descriptorType,
3347 vk::VkImageViewType viewType,
3353 static vk::Move<vk::VkImage> createImage (const vk::DeviceInterface& vki,
3354 vk::VkDevice device,
3355 vk::Allocator& allocator,
3356 vk::VkDescriptorType descriptorType,
3357 vk::VkImageViewType viewType,
3359 de::MovePtr<vk::Allocation>* outAllocation);
3361 static vk::Move<vk::VkImageView> createImageView (const vk::DeviceInterface& vki,
3362 vk::VkDevice device,
3363 vk::VkImageViewType viewType,
3365 vk::VkImage image,
3372 void uploadImage (const vk::DeviceInterface& vki,
3373 vk::VkDevice device,
3375 vk::VkQueue queue,
3376 vk::Allocator& allocator,
3377 vk::VkImage image,
3378 vk::VkImageLayout layout,
3389 const vk::VkImageViewType m_viewType;
3397 de::MovePtr<vk::Allocation> m_imageMemoryA;
3398 de::MovePtr<vk::Allocation> m_imageMemoryB;
3399 vk::Move<vk::VkImage> m_imageA;
3400 vk::Move<vk::VkImage> m_imageB;
3401 vk::Move<vk::VkImageView> m_imageViewA;
3402 vk::Move<vk::VkImageView> m_imageViewB;
3405 ImageInstanceImages::ImageInstanceImages (const vk::DeviceInterface& vki,
3406 vk::VkDevice device,
3408 vk::VkQueue queue,
3409 vk::Allocator& allocator,
3410 vk::VkDescriptorType descriptorType,
3411 vk::VkImageViewType viewType,
3423 , m_imageA (vk::Move<vk::VkImage>())
3424 , m_imageB (vk::Move<vk::VkImage>())
3425 , m_imageViewA (vk::Move<vk::VkImageView>())
3426 , m_imageViewB (vk::Move<vk::VkImageView>())
3428 const vk::VkImageLayout layout = getImageLayoutForDescriptorType(descriptorType);
3446 vk::Move<vk::VkImage> ImageInstanceImages::createImage (const vk::DeviceInterface& vki,
3447 vk::VkDevice device,
3448 vk::Allocator& allocator,
3449 vk::VkDescriptorType descriptorType,
3450 vk::VkImageViewType viewType,
3452 de::MovePtr<vk::Allocation>* outAllocation)
3455 const bool isCube = (viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY);
3456 const bool isStorage = (descriptorType == vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE);
3457 const deUint32 readUsage = (isStorage) ? (vk::VK_IMAGE_USAGE_STORAGE_BIT) : (vk::VK_IMAGE_USAGE_SAMPLED_BIT);
3458 const deUint32 arraySize = (viewType == vk::VK_IMAGE_VIEW_TYPE_1D || viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (baseLevel.getHeight())
3459 : (viewType == vk::VK_IMAGE_VIEW_TYPE_2D || viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? (baseLevel.getDepth())
3460 : (viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? (1)
3461 : (viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? (baseLevel.getDepth()) // cube: numFaces * numLayers
3463 const vk::VkExtent3D extent =
3469 (viewType == vk::VK_IMAGE_VIEW_TYPE_1D || viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (1u) : (deUint32)baseLevel.getHeight(),
3472 (viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? ((deUint32)baseLevel.getDepth()) : (1u),
3474 const vk::VkImageCreateInfo createInfo =
3476 vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
3478 isCube ? (vk::VkImageCreateFlags)vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : (vk::VkImageCreateFlags)0,
3480 vk::mapTextureFormat(baseLevel.getFormat()), // format
3484 vk::VK_SAMPLE_COUNT_1_BIT, // samples
3485 vk::VK_IMAGE_TILING_OPTIMAL, // tiling
3486 readUsage | vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT, // usage
3487 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
3490 vk::VK_IMAGE_LAYOUT_UNDEFINED, // initialLayout
3492 vk::Move<vk::VkImage> image (vk::createImage(vki, device, &createInfo));
3494 *outAllocation = allocateAndBindObjectMemory(vki, device, allocator, *image, vk::MemoryRequirement::Any);
3498 vk::Move<vk::VkImageView> ImageInstanceImages::createImageView (const vk::DeviceInterface& vki,
3499 vk::VkDevice device,
3500 vk::VkImageViewType viewType,
3502 vk::VkImage image,
3507 const deUint32 viewTypeBaseSlice = (viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? (6 * baseArraySlice) : (baseArraySlice);
3508 const deUint32 viewArraySize = (viewType == vk::VK_IMAGE_VIEW_TYPE_1D) ? (1)
3509 : (viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (baseLevel.getHeight() - viewTypeBaseSlice)
3510 : (viewType == vk::VK_IMAGE_VIEW_TYPE_2D) ? (1)
3511 : (viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? (baseLevel.getDepth() - viewTypeBaseSlice)
3512 : (viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? (1)
3513 : (viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE) ? (6)
3514 : (viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? (baseLevel.getDepth() - viewTypeBaseSlice) // cube: numFaces * numLayers
3519 const vk::VkImageSubresourceRange resourceRange =
3521 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
3527 const vk::VkImageViewCreateInfo createInfo =
3529 vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
3531 (vk::VkImageViewCreateFlags)0,
3534 vk::mapTextureFormat(baseLevel.getFormat()), // format
3536 vk::VK_COMPONENT_SWIZZLE_R,
3537 vk::VK_COMPONENT_SWIZZLE_G,
3538 vk::VK_COMPONENT_SWIZZLE_B,
3539 vk::VK_COMPONENT_SWIZZLE_A
3543 return vk::createImageView(vki, device, &createInfo);
3553 const int height = (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (ARRAY_SIZE)
3555 const int depth = (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? (1)
3556 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? (ARRAY_SIZE)
3557 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? (6 * ARRAY_SIZE)
3558 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? (IMAGE_SIZE >> level)
3587 void ImageInstanceImages::uploadImage (const vk::DeviceInterface& vki,
3588 vk::VkDevice device,
3590 vk::VkQueue queue,
3591 vk::Allocator& allocator,
3592 vk::VkImage image,
3593 vk::VkImageLayout layout,
3596 const deUint32 arraySize = (m_viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? (1) :
3597 (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? (6 * (deUint32)ARRAY_SIZE) :
3600 const vk::VkBufferCreateInfo bufferCreateInfo =
3602 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
3606 vk::VK_BUFFER_USAGE_TRANSFER_SRC_BIT, // usage
3607 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
3611 const vk::Unique<vk::VkBuffer> dataBuffer (vk::createBuffer(vki, device, &bufferCreateInfo));
3612 const de::MovePtr<vk::Allocation> dataBufferMemory = allocateAndBindObjectMemory(vki, device, allocator, *dataBuffer, vk::MemoryRequirement::HostVisible);
3613 const vk::VkBufferMemoryBarrier preMemoryBarrier =
3615 vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
3617 vk::VK_ACCESS_HOST_WRITE_BIT, // outputMask
3618 vk::VK_ACCESS_TRANSFER_READ_BIT, // inputMask
3625 const vk::VkImageSubresourceRange fullSubrange =
3627 vk::VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask
3633 const vk::VkImageMemoryBarrier preImageBarrier =
3635 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
3638 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // inputMask
3639 vk::VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout
3640 vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout
3646 const vk::VkImageMemoryBarrier postImageBarrier =
3648 vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
3650 vk::VK_ACCESS_TRANSFER_WRITE_BIT, // outputMask
3651 vk::VK_ACCESS_SHADER_READ_BIT, // inputMask
3652 vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // oldLayout
3659 const vk::VkCommandPoolCreateInfo cmdPoolCreateInfo =
3661 vk::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
3663 vk::VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // flags
3666 const vk::Unique<vk::VkCommandPool> cmdPool (vk::createCommandPool(vki, device, &cmdPoolCreateInfo));
3667 const vk::VkCommandBufferBeginInfo cmdBufBeginInfo =
3669 vk::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
3671 vk::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // flags
3672 (const vk::VkCommandBufferInheritanceInfo*)DE_NULL,
3675 const vk::Unique<vk::VkCommandBuffer> cmd (vk::allocateCommandBuffer(vki, device, *cmdPool, vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY));
3676 const vk::Unique<vk::VkFence> cmdCompleteFence (vk::createFence(vki, device));
3678 std::vector<vk::VkBufferImageCopy> copySlices;
3686 vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, (vk::VkDependencyFlags)0,
3687 0, (const vk::VkMemoryBarrier*)DE_NULL,
3690 vki.cmdCopyBufferToImage(*cmd, *dataBuffer, image, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)copySlices.size(), &copySlices[0]);
3691 vki.cmdPipelineBarrier(*cmd, vk::VK_PIPELINE_STAGE_TRANSFER_BIT, vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (vk::VkDependencyFlags)0,
3692 0, (const vk::VkMemoryBarrier*)DE_NULL,
3693 0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
3699 vk::VkSubmitInfo submitInfo =
3701 vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,
3704 (const vk::VkSemaphore*)0,
3705 (const vk::VkPipelineStageFlags*)DE_NULL,
3709 (const vk::VkSemaphore*)0,
3719 ImageFetchInstanceImages (const vk::DeviceInterface& vki,
3720 vk::VkDevice device,
3722 vk::VkQueue queue,
3723 vk::Allocator& allocator,
3724 vk::VkDescriptorType descriptorType,
3726 vk::VkImageViewType viewType,
3730 static tcu::IVec3 getFetchPos (vk::VkImageViewType viewType, deUint32 baseMipLevel, deUint32 baseArraySlice, int fetchPosNdx);
3733 inline vk::VkImageView getImageViewA (void) const { return *m_imageViewA; }
3734 inline vk::VkImageView getImageViewB (void) const { return *m_imageViewB; }
3760 ImageFetchInstanceImages::ImageFetchInstanceImages (const vk::DeviceInterface& vki,
3761 vk::VkDevice device,
3763 vk::VkQueue queue,
3764 vk::Allocator& allocator,
3765 vk::VkDescriptorType descriptorType,
3767 vk::VkImageViewType viewType,
3784 bool isImageViewTypeArray (vk::VkImageViewType type)
3786 return type == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY || type == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY || type == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
3789 tcu::IVec3 ImageFetchInstanceImages::getFetchPos (vk::VkImageViewType viewType, deUint32 baseMipLevel, deUint32 baseArraySlice, int fetchPosNdx)
3804 case vk::VK_IMAGE_VIEW_TYPE_1D:
3805 case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY: return tcu::IVec3(coord.x() % imageSize, coord.y() % arraySize, 0);
3806 case vk::VK_IMAGE_VIEW_TYPE_2D:
3807 case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY: return tcu::IVec3(coord.x() % imageSize, coord.y() % imageSize, coord.z() % arraySize);
3808 case vk::VK_IMAGE_VIEW_TYPE_CUBE:
3809 case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return tcu::IVec3(coord.x() % imageSize, coord.y() % imageSize, coord.z() % (arraySize * 6));
3810 case vk::VK_IMAGE_VIEW_TYPE_3D: return tcu::IVec3(coord.x() % imageSize, coord.y() % imageSize, coord.z() % imageSize);
3827 if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
3829 else if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY)
3843 vk::VkDescriptorType descriptorType,
3844 vk::VkShaderStageFlags stageFlags,
3846 vk::VkImageViewType viewType,
3851 static vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (const vk::DeviceInterface& vki,
3852 vk::VkDevice device,
3853 vk::VkDescriptorType descriptorType,
3855 vk::VkShaderStageFlags stageFlags,
3858 static vk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface& vki,
3859 vk::VkDevice device,
3860 vk::VkDescriptorSetLayout descriptorSetLayout);
3862 static vk::Move<vk::VkDescriptorPool> createDescriptorPool (const vk::DeviceInterface& vki,
3863 vk::VkDevice device,
3864 vk::VkDescriptorType descriptorType,
3867 static vk::Move<vk::VkDescriptorSet> createDescriptorSet (const vk::DeviceInterface& vki,
3869 vk::VkDevice device,
3870 vk::VkDescriptorType descriptorType,
3872 vk::VkDescriptorSetLayout layout,
3873 vk::VkDescriptorPool pool,
3874 vk::VkImageView viewA,
3875 vk::VkImageView viewB,
3876 vk::DescriptorSetUpdateBuilder& updateBuilder,
3877 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
3879 vk::VkPipelineLayout pipelineLayout = DE_NULL);
3881 static void writeDescriptorSet (const vk::DeviceInterface& vki,
3882 vk::VkDevice device,
3883 vk::VkDescriptorType descriptorType,
3885 vk::VkDescriptorSetLayout layout,
3886 vk::VkDescriptorPool pool,
3887 vk::VkImageView viewA,
3888 vk::VkImageView viewB,
3889 vk::VkDescriptorSet descriptorSet,
3890 vk::DescriptorSetUpdateBuilder& updateBuilder,
3893 static void writeDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
3894 vk::VkDevice device,
3895 vk::VkDescriptorType descriptorType,
3897 vk::VkDescriptorSetLayout layout,
3898 vk::VkDescriptorPool pool,
3899 vk::VkImageView viewA,
3900 vk::VkImageView viewB,
3901 vk::VkDescriptorSet descriptorSet,
3902 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
3905 vk::VkPipelineLayout pipelineLayout = 0);
3908 vk::VkPipelineLayout getPipelineLayout (void) const;
3909 void writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const;
3918 const vk::VkDescriptorType m_descriptorType;
3919 const vk::VkShaderStageFlags m_stageFlags;
3921 const vk::VkImageViewType m_viewType;
3925 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
3927 vk::DescriptorSetUpdateBuilder m_updateBuilder;
3928 const vk::Unique<vk::VkDescriptorSetLayout> m_descriptorSetLayout;
3929 const vk::Unique<vk::VkPipelineLayout> m_pipelineLayout;
3931 const vk::Unique<vk::VkDescriptorPool> m_descriptorPool;
3932 const vk::Unique<vk::VkDescriptorSet> m_descriptorSet;
3938 vk::VkDescriptorType descriptorType,
3939 vk::VkShaderStageFlags stageFlags,
3941 vk::VkImageViewType viewType,
3963 vk::Move<vk::VkDescriptorSetLayout> ImageFetchRenderInstance::createDescriptorSetLayout (const vk::DeviceInterface& vki,
3964 vk::VkDevice device,
3965 vk::VkDescriptorType descriptorType,
3967 vk::VkShaderStageFlags stageFlags,
3970 vk::DescriptorSetLayoutBuilder builder;
3971 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
3976 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
4001 vk::Move<vk::VkPipelineLayout> ImageFetchRenderInstance::createPipelineLayout (const vk::DeviceInterface& vki,
4002 vk::VkDevice device,
4003 vk::VkDescriptorSetLayout descriptorSetLayout)
4005 const vk::VkPipelineLayoutCreateInfo createInfo =
4007 vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
4009 (vk::VkPipelineLayoutCreateFlags)0,
4015 return vk::createPipelineLayout(vki, device, &createInfo);
4018 vk::Move<vk::VkDescriptorPool> ImageFetchRenderInstance::createDescriptorPool (const vk::DeviceInterface& vki,
4019 vk::VkDevice device,
4020 vk::VkDescriptorType descriptorType,
4023 return vk::DescriptorPoolBuilder()
4025 .build(vki, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
4028 vk::Move<vk::VkDescriptorSet> ImageFetchRenderInstance::createDescriptorSet (const vk::DeviceInterface& vki,
4030 vk::VkDevice device,
4031 vk::VkDescriptorType descriptorType,
4033 vk::VkDescriptorSetLayout layout,
4034 vk::VkDescriptorPool pool,
4035 vk::VkImageView viewA,
4036 vk::VkImageView viewB,
4037 vk::DescriptorSetUpdateBuilder& updateBuilder,
4038 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
4040 vk::VkPipelineLayout pipelineLayout)
4042 const vk::VkDescriptorSetAllocateInfo allocInfo =
4044 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
4051 vk::Move<vk::VkDescriptorSet> descriptorSet;
4058 descriptorSet = vk::Move<vk::VkDescriptorSet>();
4080 void ImageFetchRenderInstance::writeDescriptorSet (const vk::DeviceInterface& vki,
4081 vk::VkDevice device,
4082 vk::VkDescriptorType descriptorType,
4084 vk::VkDescriptorSetLayout layout,
4085 vk::VkDescriptorPool pool,
4086 vk::VkImageView viewA,
4087 vk::VkImageView viewB,
4088 vk::VkDescriptorSet descriptorSet,
4089 vk::DescriptorSetUpdateBuilder& updateBuilder,
4094 const vk::VkImageLayout imageLayout = getImageLayoutForDescriptorType(descriptorType);
4095 const vk::VkDescriptorImageInfo imageInfos[2] =
4104 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &imageInfos[0]);
4108 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &imageInfos[0]);
4109 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), descriptorType, &imageInfos[1]);
4113 updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, 2u, imageInfos);
4126 void ImageFetchRenderInstance::writeDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
4127 vk::VkDevice device,
4128 vk::VkDescriptorType descriptorType,
4130 vk::VkDescriptorSetLayout layout,
4131 vk::VkDescriptorPool pool,
4132 vk::VkImageView viewA,
4133 vk::VkImageView viewB,
4134 vk::VkDescriptorSet descriptorSet,
4135 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
4138 vk::VkPipelineLayout pipelineLayout)
4141 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
4142 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
4144 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
4149 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
4151 vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
4155 const vk::VkImageLayout imageLayout = getImageLayoutForDescriptorType(descriptorType);
4156 const vk::VkDescriptorImageInfo imageInfos[2] =
4186 updateTemplate = vk::createDescriptorUpdateTemplate(vki, device, &templateCreateInfo);
4204 << " descriptor(s) of type " << vk::getDescriptorTypeName(m_descriptorType) << "\n"
4205 << "Image view type is " << vk::getImageViewTypeName(m_viewType) << "\n";
4234 << (((m_stageFlags & vk::VK_SHADER_STAGE_VERTEX_BIT) != 0) ? (" vertex") : (""))
4235 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0) ? (" tess_control") : (""))
4236 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0) ? (" tess_evaluation") : (""))
4237 << (((m_stageFlags & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0) ? (" geometry") : (""))
4238 << (((m_stageFlags & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0) ? (" fragment") : (""))
4248 vk::VkPipelineLayout ImageFetchRenderInstance::getPipelineLayout (void) const
4253 void ImageFetchRenderInstance::writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const
4257 m_vki.cmdBindDescriptorSets(cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, getPipelineLayout(), 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
4265 m_updateBuilder.updateWithPush(m_vki, cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0);
4295 vk::VkDescriptorType descriptorType,
4297 vk::VkImageViewType viewType,
4302 vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (void) const;
4303 vk::Move<vk::VkDescriptorPool> createDescriptorPool (void) const;
4304 vk::Move<vk::VkDescriptorSet> createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout);
4305 void writeDescriptorSet (vk::VkDescriptorSet descriptorSet);
4306 void writeDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush = false, vk::VkPipelineLayout pipelineLayout = DE_NULL);
4314 const vk::VkDescriptorType m_descriptorType;
4316 const vk::VkImageViewType m_viewType;
4319 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
4321 const vk::DeviceInterface& m_vki;
4322 const vk::VkDevice m_device;
4323 const vk::VkQueue m_queue;
4325 vk::Allocator& m_allocator;
4331 vk::DescriptorSetUpdateBuilder m_updateBuilder;
4336 vk::VkDescriptorType descriptorType,
4338 vk::VkImageViewType viewType,
4361 vk::Move<vk::VkDescriptorSetLayout> ImageFetchComputeInstance::createDescriptorSetLayout (void) const
4363 vk::DescriptorSetLayoutBuilder builder;
4364 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
4369 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
4372 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT);
4377 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
4381 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
4382 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
4386 builder.addArrayBinding(m_descriptorType, 2u, vk::VK_SHADER_STAGE_COMPUTE_BIT);
4396 vk::Move<vk::VkDescriptorPool> ImageFetchComputeInstance::createDescriptorPool (void) const
4398 return vk::DescriptorPoolBuilder()
4399 .addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
4401 .build(m_vki, m_device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
4404 vk::Move<vk::VkDescriptorSet> ImageFetchComputeInstance::createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout)
4406 const vk::VkDescriptorSetAllocateInfo allocInfo =
4408 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
4415 vk::Move<vk::VkDescriptorSet> descriptorSet;
4422 descriptorSet = vk::Move<vk::VkDescriptorSet>();
4437 void ImageFetchComputeInstance::writeDescriptorSet (vk::VkDescriptorSet descriptorSet)
4439 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
4440 const vk::VkImageLayout imageLayout = getImageLayoutForDescriptorType(m_descriptorType);
4441 const vk::VkDescriptorImageInfo imageInfos[2] =
4448 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo);
4454 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, &imageInfos[0]);
4458 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, &imageInfos[0]);
4459 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), m_descriptorType, &imageInfos[1]);
4463 m_updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, 2u, imageInfos);
4476 void ImageFetchComputeInstance::writeDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush, vk::VkPipelineLayout pipelineLayout)
4478 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
4479 const vk::VkImageLayout imageLayout = getImageLayoutForDescriptorType(m_descriptorType);
4480 const vk::VkDescriptorImageInfo imageInfos[2] =
4485 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
4486 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
4488 vk
4493 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
4495 vk::VK_PIPELINE_BIND_POINT_COMPUTE,
4505 updateEntries.push_back(createTemplateBinding(0u, 0, 1, vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, m_updateRegistry.getWriteObjectOffset(0), 0));
4530 m_updateTemplate = vk::createDescriptorUpdateTemplate(m_vki, m_device, &templateCreateInfo);
4554 << " descriptor(s) of type " << vk::getDescriptorTypeName(m_descriptorType) << "\n"
4555 << "Image view type is " << vk::getImageViewTypeName(m_viewType) << "\n";
4583 const vk::Unique<vk::VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout());
4584 const vk::Unique<vk::VkDescriptorPool> descriptorPool (createDescriptorPool());
4585 const vk::Unique<vk::VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout));
4588 const vk::VkDescriptorSet descriptorSets[] = { *descriptorSet };
4592 const vk::VkBufferMemoryBarrier* const preBarriers = DE_NULL;
4594 const vk::VkBufferMemoryBarrier* const postBarriers = m_result.getResultReadBarrier();
4666 ImageSampleInstanceImages (const vk::DeviceInterface& vki,
4667 vk::VkDevice device,
4669 vk::VkQueue queue,
4670 vk::Allocator& allocator,
4671 vk::VkDescriptorType descriptorType,
4673 vk::VkImageViewType viewType,
4678 static tcu::Vec4 getSamplePos (vk::VkImageViewType viewType, deUint32 baseMipLevel, deUint32 baseArraySlice, int samplePosNdx);
4681 inline vk::VkImageView getImageViewA (void) const { return *m_imageViewA; }
4682 inline vk::VkImageView getImageViewB (void) const { return *m_imageViewB; }
4683 inline vk::VkSampler getSamplerA (void) const { return *m_samplerA; }
4684 inline vk::VkSampler getSamplerB (void) const { return *m_samplerB; }
4688 static int getNumImages (vk::VkDescriptorType descriptorType, ShaderInputInterface shaderInterface);
4690 static vk::Move<vk::VkSampler> createSampler (const vk::DeviceInterface& vki, vk::VkDevice device, const tcu::Sampler& sampler, const tcu::TextureFormat& format);
4697 const vk::VkDescriptorType m_descriptorType;
4703 const vk::Unique<vk::VkSampler> m_samplerA;
4704 const vk::Unique<vk::VkSampler> m_samplerB;
4707 ImageSampleInstanceImages::ImageSampleInstanceImages (const vk::DeviceInterface& vki,
4708 vk::VkDevice device,
4710 vk::VkQueue queue,
4711 vk::Allocator& allocator,
4712 vk::VkDescriptorType descriptorType,
4714 vk::VkImageViewType viewType,
4735 ? vk::Move<vk::VkSampler>()
4740 tcu::Vec4 ImageSampleInstanceImages::getSamplePos (vk::VkImageViewType viewType, deUint32 baseMipLevel, deUint32 baseArraySlice, int samplePosNdx)
4751 case vk::VK_IMAGE_VIEW_TYPE_1D:
4752 case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY:
4753 case vk::VK_IMAGE_VIEW_TYPE_2D:
4754 case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY:
4755 case vk::VK_IMAGE_VIEW_TYPE_3D:
4783 if (viewType == vk::VK_IMAGE_VIEW_TYPE_1D || viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY)
4788 else if (viewType == vk::VK_IMAGE_VIEW_TYPE_2D || viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY)
4793 else if (viewType == vk::VK_IMAGE_VIEW_TYPE_3D)
4805 case vk::VK_IMAGE_VIEW_TYPE_CUBE:
4806 case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
4857 const bool isSamplerCase = (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER);
4873 case vk::VK_IMAGE_VIEW_TYPE_1D:
4874 case vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY: return getRef1DView(sampleSrc, m_baseMipLevel, m_baseArraySlice, &levelStorage).sample(sampler, samplePos.x(), samplePos.y(), lod);
4875 case vk::VK_IMAGE_VIEW_TYPE_2D:
4876 case vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY: return getRef2DView(sampleSrc, m_baseMipLevel, m_baseArraySlice, &levelStorage).sample(sampler, samplePos.x(), samplePos.y(), samplePos.z(), lod);
4877 case vk::VK_IMAGE_VIEW_TYPE_3D: return getRef3DView(sampleSrc, m_baseMipLevel, m_baseArraySlice, &levelStorage).sample(sampler, samplePos.x(), samplePos.y(), samplePos.z(), lod);
4878 case vk::VK_IMAGE_VIEW_TYPE_CUBE:
4879 case vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return getRefCubeView(sampleSrc, m_baseMipLevel, m_baseArraySlice, &levelStorage).sample(sampler, samplePos.x(), samplePos.y(), samplePos.z(), samplePos.w(), lod);
4889 int ImageSampleInstanceImages::getNumImages (vk::VkDescriptorType descriptorType, ShaderInputInterface shaderInterface)
4892 if (descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
4894 else if (descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
4920 vk::Move<vk::VkSampler> ImageSampleInstanceImages::createSampler (const vk::DeviceInterface& vki, vk::VkDevice device, const tcu::Sampler& sampler, const tcu::TextureFormat& format)
4922 const vk::VkSamplerCreateInfo createInfo = vk::mapSampler(sampler, format);
4924 return vk::createSampler(vki, device, &createInfo);
5005 vk::VkDescriptorType descriptorType,
5006 vk::VkShaderStageFlags stageFlags,
5008 vk::VkImageViewType viewType,
5014 static vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (const vk::DeviceInterface& vki,
5015 vk::VkDevice device,
5016 vk::VkDescriptorType descriptorType,
5018 vk::VkShaderStageFlags stageFlags,
5022 static vk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface& vki,
5023 vk::VkDevice device,
5024 vk::VkDescriptorSetLayout descriptorSetLayout);
5026 static vk::Move<vk::VkDescriptorPool> createDescriptorPool (const vk::DeviceInterface& vki,
5027 vk::VkDevice device,
5028 vk::VkDescriptorType descriptorType,
5031 static vk::Move<vk::VkDescriptorSet> createDescriptorSet (const vk::DeviceInterface& vki,
5033 vk::VkDevice device,
5034 vk::VkDescriptorType descriptorType,
5036 vk::VkDescriptorSetLayout layout,
5037 vk::VkDescriptorPool pool,
5040 vk::DescriptorSetUpdateBuilder& updateBuilder,
5041 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
5043 vk::VkPipelineLayout pipelineLayout = DE_NULL);
5045 static void writeSamplerDescriptorSet (const vk::DeviceInterface& vki,
5046 vk::VkDevice device,
5050 vk::VkDescriptorSet descriptorSet,
5051 vk::DescriptorSetUpdateBuilder& updateBuilder,
5054 static void writeImageSamplerDescriptorSet (const vk::DeviceInterface& vki,
5055 vk::VkDevice device,
5059 vk::VkDescriptorSet descriptorSet,
5060 vk::DescriptorSetUpdateBuilder& updateBuilder,
5063 static void writeSamplerDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
5064 vk::VkDevice device,
5068 vk::VkDescriptorSet descriptorSet,
5069 vk::VkDescriptorSetLayout layout,
5070 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
5073 vk::VkPipelineLayout pipelineLayout = 0);
5075 static void writeImageSamplerDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
5076 vk::VkDevice device,
5080 vk::VkDescriptorSet descriptorSet,
5081 vk::VkDescriptorSetLayout layout,
5082 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
5085 vk::VkPipelineLayout pipelineLayout = 0);
5088 vk::VkPipelineLayout getPipelineLayout (void) const;
5089 void writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const;
5098 const vk::VkDescriptorType m_descriptorType;
5099 const vk::VkShaderStageFlags m_stageFlags;
5101 const vk::VkImageViewType m_viewType;
5105 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
5107 vk::DescriptorSetUpdateBuilder m_updateBuilder;
5109 const vk::Unique<vk::VkDescriptorSetLayout> m_descriptorSetLayout;
5110 const vk::Unique<vk::VkPipelineLayout> m_pipelineLayout;
5111 const vk::Unique<vk::VkDescriptorPool> m_descriptorPool;
5112 const vk::Unique<vk::VkDescriptorSet> m_descriptorSet;
5118 vk::VkDescriptorType descriptorType,
5119 vk::VkShaderStageFlags stageFlags,
5121 vk::VkImageViewType viewType,
5144 vk::Move<vk::VkDescriptorSetLayout> ImageSampleRenderInstance::createDescriptorSetLayout (const vk::DeviceInterface& vki,
5145 vk::VkDevice device,
5146 vk::VkDescriptorType descriptorType,
5148 vk::VkShaderStageFlags stageFlags,
5152 const vk::VkSampler samplers[2] =
5158 vk::DescriptorSetLayoutBuilder builder;
5159 const bool addSeparateImage = descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER;
5160 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
5165 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
5173 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, stageFlags);
5179 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, stageFlags);
5187 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, stageFlags);
5193 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, stageFlags);
5204 vk::Move<vk::VkPipelineLayout> ImageSampleRenderInstance::createPipelineLayout (const vk::DeviceInterface& vki,
5205 vk::VkDevice device,
5206 vk::VkDescriptorSetLayout descriptorSetLayout)
5208 const vk::VkPipelineLayoutCreateInfo createInfo =
5210 vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
5212 (vk::VkPipelineLayoutCreateFlags)0,
5218 return vk::createPipelineLayout(vki, device, &createInfo);
5221 vk::Move<vk::VkDescriptorPool> ImageSampleRenderInstance::createDescriptorPool (const vk::DeviceInterface& vki,
5222 vk::VkDevice device,
5223 vk::VkDescriptorType descriptorType,
5226 vk::DescriptorPoolBuilder builder;
5228 if (descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5231 builder.addType(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
5234 builder.addType(vk::VK_DESCRIPTOR_TYPE_SAMPLER, getInterfaceNumResources(shaderInterface));
5236 else if (descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5239 builder.addType(vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, getInterfaceNumResources(shaderInterface));
5244 return builder.build(vki, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
5247 vk::Move<vk::VkDescriptorSet> ImageSampleRenderInstance::createDescriptorSet (const vk::DeviceInterface& vki,
5249 vk::VkDevice device,
5250 vk::VkDescriptorType descriptorType,
5252 vk::VkDescriptorSetLayout layout,
5253 vk::VkDescriptorPool pool,
5256 vk::DescriptorSetUpdateBuilder& updateBuilder,
5257 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
5259 vk::VkPipelineLayout pipelineLayout)
5261 const vk::VkDescriptorSetAllocateInfo allocInfo =
5263 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
5270 vk::Move<vk::VkDescriptorSet> descriptorSet;
5277 descriptorSet = vk::Move<vk::VkDescriptorSet>();
5282 if (descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5284 else if (descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5291 if (descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5293 else if (descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5300 if (descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5302 else if (descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5309 if (descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5311 else if (descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5320 void ImageSampleRenderInstance::writeSamplerDescriptorSet (const vk::DeviceInterface& vki,
5321 vk::VkDevice device,
5325 vk::VkDescriptorSet descriptorSet,
5326 vk::DescriptorSetUpdateBuilder& updateBuilder,
5329 const vk::VkDescriptorImageInfo imageInfo = makeDescriptorImageInfo(images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
5330 const vk::VkDescriptorImageInfo samplersInfos[2] =
5339 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(samplerLocation), vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, &imageInfo);
5347 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[0]);
5351 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[0]);
5352 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[1]);
5356 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[0]);
5357 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[1]);
5361 updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, 2u, samplersInfos);
5375 void ImageSampleRenderInstance::writeImageSamplerDescriptorSet (const vk::DeviceInterface& vki,
5376 vk::VkDevice device,
5380 vk::VkDescriptorSet descriptorSet,
5381 vk::DescriptorSetUpdateBuilder& updateBuilder,
5384 const vk::VkSampler samplers[2] =
5389 const vk::VkDescriptorImageInfo imageSamplers[2] =
5391 vk::makeDescriptorImageInfo(samplers[0], images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
5392 vk::makeDescriptorImageInfo(samplers[1], images.getImageViewB(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
5399 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageSamplers[0]);
5403 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageSamplers[0]);
5404 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageSamplers[1]);
5408 updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2u, imageSamplers);
5421 void ImageSampleRenderInstance::writeSamplerDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
5422 vk::VkDevice device,
5426 vk::VkDescriptorSet descriptorSet,
5427 vk::VkDescriptorSetLayout layout,
5428 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
5431 vk::VkPipelineLayout pipelineLayout)
5433 const vk::VkDescriptorImageInfo imageInfo = makeDescriptorImageInfo(images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
5434 const vk::VkDescriptorImageInfo samplersInfos[2] =
5442 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
5443 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
5445 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
5450 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
5452 vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
5461 updateEntries.push_back(createTemplateBinding(samplerLocation, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, updateRegistry.getWriteObjectOffset(0), 0));
5469 updateEntries.push_back(createTemplateBinding(1, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, updateRegistry.getWriteObjectOffset(1), 0));
5473 updateEntries.push_back(createTemplateBinding(1, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, updateRegistry.getWriteObjectOffset(1), 0));
5474 updateEntries.push_back(createTemplateBinding(2, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, updateRegistry.getWriteObjectOffset(2), 0));
5478 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, updateRegistry.getWriteObjectOffset(1), 0));
5479 updateEntries.push_back(createTemplateBinding(2, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, updateRegistry.getWriteObjectOffset(2), 0));
5483 updateEntries.push_back(createTemplateBinding(1, 0, 2, vk::VK_DESCRIPTOR_TYPE_SAMPLER, updateRegistry.getWriteObjectOffset(1), sizeof(samplersInfos[0])));
5494 updateTemplate = vk::createDescriptorUpdateTemplate(vki, device, &templateCreateInfo);
5503 void ImageSampleRenderInstance::writeImageSamplerDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
5504 vk::VkDevice device,
5508 vk::VkDescriptorSet descriptorSet,
5509 vk::VkDescriptorSetLayout layout,
5510 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
5513 vk::VkPipelineLayout pipelineLayout)
5515 const vk::VkSampler samplers[2] =
5520 const vk::VkDescriptorImageInfo imageSamplers[2] =
5522 vk::makeDescriptorImageInfo(samplers[0], images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
5523 vk::makeDescriptorImageInfo(samplers[1], images.getImageViewB(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
5526 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
5527 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
5529 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
5534 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
5536 vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
5547 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, updateRegistry.getWriteObjectOffset(0), 0));
5551 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, updateRegistry.getWriteObjectOffset(0), 0));
5552 updateEntries.push_back(createTemplateBinding(1, 0, 1, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, updateRegistry.getWriteObjectOffset(1), 0));
5556 updateEntries.push_back(createTemplateBinding(0, 0, 2, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, updateRegistry.getWriteObjectOffset(0), sizeof(imageSamplers[0])));
5566 updateTemplate = vk::createDescriptorUpdateTemplate(vki, device, &templateCreateInfo);
5580 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5590 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5603 msg << "Image view type is " << vk::getImageViewTypeName(m_viewType) << "\n";
5631 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5633 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5642 << (((m_stageFlags & vk::VK_SHADER_STAGE_VERTEX_BIT) != 0) ? (" vertex") : (""))
5643 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0) ? (" tess_control") : (""))
5644 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0) ? (" tess_evaluation") : (""))
5645 << (((m_stageFlags & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0) ? (" geometry") : (""))
5646 << (((m_stageFlags & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0) ? (" fragment") : (""))
5656 vk::VkPipelineLayout ImageSampleRenderInstance::getPipelineLayout (void) const
5661 void ImageSampleRenderInstance::writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const
5665 m_vki.cmdBindDescriptorSets(cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, getPipelineLayout(), 0u, 1u, &m_descriptorSet.get(), 0u, DE_NULL);
5673 m_updateBuilder.updateWithPush(m_vki, cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0);
5704 vk::VkDescriptorType descriptorType,
5706 vk::VkImageViewType viewType,
5712 vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (void) const;
5713 vk::Move<vk::VkDescriptorPool> createDescriptorPool (void) const;
5714 vk::Move<vk::VkDescriptorSet> createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout);
5715 void writeDescriptorSet (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, vk::VkPipelineLayout pipelineLayout = DE_NULL);
5716 void writeImageSamplerDescriptorSet (vk::VkDescriptorSet descriptorSet);
5717 void writeImageSamplerDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush = false, vk::VkPipelineLayout pipelineLayout = DE_NULL);
5718 void writeSamplerDescriptorSet (vk::VkDescriptorSet descriptorSet);
5719 void writeSamplerDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush = false, vk::VkPipelineLayout pipelineLayout = DE_NULL);
5726 const vk::VkDescriptorType m_descriptorType;
5728 const vk::VkImageViewType m_viewType;
5732 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
5734 const vk::DeviceInterface& m_vki;
5735 const vk::VkDevice m_device;
5736 const vk::VkQueue m_queue;
5738 vk::Allocator& m_allocator;
5744 vk::DescriptorSetUpdateBuilder m_updateBuilder;
5749 vk::VkDescriptorType descriptorType,
5751 vk::VkImageViewType viewType,
5776 vk::Move<vk::VkDescriptorSetLayout> ImageSampleComputeInstance::createDescriptorSetLayout (void) const
5778 const vk::VkSampler samplers[2] =
5784 vk::DescriptorSetLayoutBuilder builder;
5785 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
5790 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
5794 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT);
5797 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5798 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, vk::VK_SHADER_STAGE_COMPUTE_BIT);
5804 builder.addSingleSamplerBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT, (m_images.isImmutable()) ? (&samplers[0]) : (DE_NULL));
5808 builder.addSingleSamplerBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT, (m_images.isImmutable()) ? (&samplers[0]) : (DE_NULL));
5809 builder.addSingleSamplerBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT, (m_images.isImmutable()) ? (&samplers[1]) : (DE_NULL));
5813 builder.addArraySamplerBinding(m_descriptorType, 2u, vk::VK_SHADER_STAGE_COMPUTE_BIT, (m_images.isImmutable()) ? (samplers) : (DE_NULL));
5823 vk::Move<vk::VkDescriptorPool> ImageSampleComputeInstance::createDescriptorPool (void) const
5825 vk::DescriptorPoolBuilder builder;
5827 builder.addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
5830 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5831 builder.addType(vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
5833 return builder.build(m_vki, m_device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
5836 vk::Move<vk::VkDescriptorSet> ImageSampleComputeInstance::createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout)
5838 const vk::VkDescriptorSetAllocateInfo allocInfo =
5840 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
5849 vk::Move<vk::VkDescriptorSet> descriptorSet = allocateDescriptorSet(m_vki, m_device, &allocInfo);
5855 return vk::Move<vk::VkDescriptorSet>();
5858 void ImageSampleComputeInstance::writeDescriptorSet (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, vk::VkPipelineLayout pipelineLayout)
5862 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5864 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5871 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5873 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5880 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5882 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5889 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
5891 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
5898 void ImageSampleComputeInstance::writeSamplerDescriptorSet (vk::VkDescriptorSet descriptorSet)
5900 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
5901 const vk::VkDescriptorImageInfo imageInfo = makeDescriptorImageInfo(m_images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
5902 const vk::VkDescriptorImageInfo samplersInfos[2] =
5909 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo);
5912 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, &imageInfo);
5920 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[0]);
5924 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[0]);
5925 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(3u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, &samplersInfos[1]);
5929 m_updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_SAMPLER, 2u, samplersInfos);
5943 void ImageSampleComputeInstance::writeSamplerDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush, vk::VkPipelineLayout pipelineLayout)
5945 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
5946 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
5947 const vk::VkDescriptorImageInfo imageInfo = makeDescriptorImageInfo(m_images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
5948 const vk::VkDescriptorImageInfo samplersInfos[2] =
5953 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
5955 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
5960 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
5962 vk::VK_PIPELINE_BIND_POINT_COMPUTE,
5972 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, m_updateRegistry.getWriteObjectOffset(0), 0));
5974 updateEntries.push_back(createTemplateBinding(1, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, m_updateRegistry.getWriteObjectOffset(1), 0));
5982 updateEntries.push_back(createTemplateBinding(2, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, m_updateRegistry.getWriteObjectOffset(2), 0));
5986 updateEntries.push_back(createTemplateBinding(2, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, m_updateRegistry.getWriteObjectOffset(2), 0));
5987 updateEntries.push_back(createTemplateBinding(3, 0, 1, vk::VK_DESCRIPTOR_TYPE_SAMPLER, m_updateRegistry.getWriteObjectOffset(3), 0));
5991 updateEntries.push_back(createTemplateBinding(2, 0, 2, vk::VK_DESCRIPTOR_TYPE_SAMPLER, m_updateRegistry.getWriteObjectOffset(2), sizeof(samplersInfos[0])));
6002 m_updateTemplate = vk::createDescriptorUpdateTemplate(m_vki, m_device, &templateCreateInfo);
6010 void ImageSampleComputeInstance::writeImageSamplerDescriptorSet (vk::VkDescriptorSet descriptorSet)
6012 const vkvk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
6013 const vk::VkSampler samplers[2] =
6018 const vk::VkDescriptorImageInfo imageSamplers[2] =
6020 makeDescriptorImageInfo(samplers[0], m_images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
6021 makeDescriptorImageInfo(samplers[1], m_images.getImageViewB(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
6025 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo);
6031 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageSamplers[0]);
6035 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageSamplers[0]);
6036 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imageSamplers[1]);
6040 m_updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2u, imageSamplers);
6053 void ImageSampleComputeInstance::writeImageSamplerDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush, vk::VkPipelineLayout pipelineLayout)
6055 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
6056 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
6057 const vk::VkSampler samplers[2] =
6062 const vk::VkDescriptorImageInfo imageSamplers[2] =
6064 makeDescriptorImageInfo(samplers[0], m_images.getImageViewA(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
6065 makeDescriptorImageInfo(samplers[1], m_images.getImageViewB(), vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL),
6067 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
6069 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
6074 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
6076 vk::VK_PIPELINE_BIND_POINT_COMPUTE,
6085 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, m_updateRegistry.getWriteObjectOffset(0), 0));
6091 updateEntries.push_back(createTemplateBinding(1, 0, 1, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, m_updateRegistry.getWriteObjectOffset(1), 0));
6095 updateEntries.push_back(createTemplateBinding(1, 0, 1, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, m_updateRegistry.getWriteObjectOffset(1), 0));
6096 updateEntries.push_back(createTemplateBinding(2, 0, 1, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, m_updateRegistry.getWriteObjectOffset(2), 0));
6100 updateEntries.push_back(createTemplateBinding(1, 0, 2, vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, m_updateRegistry.getWriteObjectOffset(1), sizeof(imageSamplers[0])));
6110 m_updateTemplate = vk::createDescriptorUpdateTemplate(m_vki, m_device, &templateCreateInfo);
6130 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
6139 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
6151 msg << "Image view type is " << vk::getImageViewTypeName(m_viewType) << "\n";
6171 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
6173 else if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
6189 const vk::Unique<vk::VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout());
6190 const vk::Unique<vk::VkDescriptorPool> descriptorPool (createDescriptorPool());
6191 const vk::Unique<vk::VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout));
6194 const vk::VkDescriptorSet descriptorSets[] = { *descriptorSet };
6198 const vk::VkBufferMemoryBarrier* const preBarriers = DE_NULL;
6200 const vk::VkBufferMemoryBarrier* const postBarriers = m_result.getResultReadBarrier();
6289 vk::VkDescriptorType descriptorType,
6290 vk::VkShaderStageFlags exitingStages,
6291 vk::VkShaderStageFlags activeStages,
6293 vk::VkImageViewType viewType,
6297 std::string genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const;
6298 std::string genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const;
6301 std::string genResourceAccessSource (vk::VkShaderStageFlagBits stage) const;
6309 const vk::VkDescriptorType m_descriptorType;
6311 const vk::VkImageViewType m_viewType;
6322 vk::VkDescriptorType descriptorType,
6323 vk::VkShaderStageFlags exitingStages,
6324 vk::VkShaderStageFlags activeStages,
6326 vk::VkImageViewType viewType,
6330 (viewType == vk::VK_IMAGE_VIEW_TYPE_1D || viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? glu::GLSL_VERSION_440 : glu::GLSL_VERSION_310_ES,
6343 std::string ImageDescriptorCase::genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const
6347 if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
6353 std::string ImageDescriptorCase::genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const
6358 const std::string dimensionBase = (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? ("1D")
6359 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? ("2D")
6360 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? ("3D")
6361 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? ("Cube")
6363 const std::string dimensionArray = (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? ("1DArray")
6364 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D || m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? ("2DArray")
6365 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? ("3D")
6366 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE || m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? ("CubeArray")
6371 DE_ASSERT(m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER);
6379 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
6382 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
6384 case vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
6386 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
6398 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
6407 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
6410 case vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
6413 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
6424 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
6427 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
6429 case vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
6431 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
6446 DE_ASSERT(m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE || m_descriptorType == vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE);
6449 if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D)
6453 else if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY || m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D)
6469 DE_ASSERT(m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER || m_descriptorType == vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
6472 if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D)
6478 else if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY || m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D)
6484 else if (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
6498 std::string ImageDescriptorCase::genResourceAccessSource (vk::VkShaderStageFlagBits stage) const
6502 const char* const dimension = (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D) ? ("1D")
6503 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY) ? ("1DArray")
6504 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D) ? ("2D")
6505 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY) ? ("2DArray")
6506 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_3D) ? ("3D")
6507 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE) ? ("Cube")
6508 : (m_viewType == vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) ? ("CubeArray")
6523 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
6524 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
6535 if (m_descriptorType == vk::VK_DESCRIPTOR_TYPE_SAMPLER)
6561 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
6604 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
6605 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
6606 if (m_exitingStages == vk::VK_SHADER_STAGE_COMPUTE_BIT)
6614 case vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
6615 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
6616 if (m_exitingStages == vk::VK_SHADER_STAGE_COMPUTE_BIT)
6633 TexelBufferInstanceBuffers (const vk::DeviceInterface& vki,
6634 vk::VkDevice device,
6635 vk::Allocator& allocator,
6636 vk::VkDescriptorType descriptorType,
6641 static vk::Move<vk::VkBuffer> createBuffer (const vk::DeviceInterface& vki,
6642 vk::VkDevice device,
6643 vk::Allocator& allocator,
6644 vk::VkDescriptorType descriptorType,
6645 de::MovePtr<vk::Allocation> *outAllocation);
6647 static vk::Move<vk::VkBufferView> createBufferView (const vk::DeviceInterface& vki,
6648 vk::VkDevice device,
6651 vk::VkBuffer buffer);
6653 static vk::VkBufferMemoryBarrier createBarrier (vk::VkDescriptorType descriptorType, vk::VkBuffer buffer);
6656 void uploadData (const vk::DeviceInterface& vki, vk::VkDevice device, const vk::Allocation& memory, const de::ArrayBuffer<deUint8>& data);
6664 inline vk::VkBufferView getBufferViewA (void) const { return *m_bufferViewA; }
6665 inline vk::VkBufferView getBufferViewB (void) const { return *m_bufferViewB; }
6666 inline const vk::VkBufferMemoryBarrier* getBufferInitBarriers (void) const { return m_bufferBarriers; }
6694 de::MovePtr<vk::Allocation> m_bufferMemoryA;
6695 de::MovePtr<vk::Allocation> m_bufferMemoryB;
6696 const vk::Unique<vk::VkBuffer> m_bufferA;
6697 const vk::Unique<vk::VkBuffer> m_bufferB;
6698 const vk::Unique<vk::VkBufferView> m_bufferViewA;
6699 const vk::Unique<vk::VkBufferView> m_bufferViewB;
6700 vk::VkBufferMemoryBarrier m_bufferBarriers[2];
6703 TexelBufferInstanceBuffers::TexelBufferInstanceBuffers (const vk::DeviceInterface& vki,
6704 vk::VkDevice device,
6705 vk::Allocator& allocator,
6706 vk::VkDescriptorType descriptorType,
6722 ? vk::Move<vk::VkBuffer>()
6726 ? vk::Move<vk::VkBufferView>()
6748 vk::Move<vk::VkBuffer> TexelBufferInstanceBuffers::createBuffer (const vk::DeviceInterface& vki,
6749 vk::VkDevice device,
6750 vk::Allocator& allocator,
6751 vk::VkDescriptorType descriptorType,
6752 de::MovePtr<vk::Allocation> *outAllocation)
6754 const vk::VkBufferUsageFlags usage = (isUniformDescriptorType(descriptorType)) ? (vkvk::VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
6755 const vk::VkBufferCreateInfo createInfo =
6757 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
6760 (vk::VkDeviceSize)BUFFER_SIZE, // size
6762 vk::VK_SHARING_MODE_EXCLUSIVE, // sharingMode
6766 vk::Move<vk::VkBuffer> buffer (vk::createBuffer(vki, device, &createInfo));
6767 de::MovePtr<vk::Allocation> allocation (allocateAndBindObjectMemory(vki, device, allocator, *buffer, vk::MemoryRequirement::HostVisible));
6773 vk::Move<vk::VkBufferView> TexelBufferInstanceBuffers::createBufferView (const vk::DeviceInterface& vki,
6774 vk::VkDevice device,
6777 vk::VkBuffer buffer)
6779 const vk::VkBufferViewCreateInfo createInfo =
6781 vk::VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,
6783 (vk::VkBufferViewCreateFlags)0,
6785 vk::mapTextureFormat(textureFormat), // format
6786 (vk::VkDeviceSize)offset, // offset
6787 (vk::VkDeviceSize)VIEW_DATA_SIZE // range
6789 return vk::createBufferView(vki, device, &createInfo);
6792 vk::VkBufferMemoryBarrier TexelBufferInstanceBuffers::createBarrier (vk::VkDescriptorType descriptorType, vk::VkBuffer buffer)
6794 const vk::VkAccessFlags inputBit = (isUniformDescriptorType(descriptorType)) ? (vk::VK_ACCESS_UNIFORM_READ_BIT) : (vk::VK_ACCESS_SHADER_READ_BIT);
6795 const vk::VkBufferMemoryBarrier barrier =
6797 vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
6799 vk::VK_ACCESS_HOST_WRITE_BIT, // outputMask
6805 (vk::VkDeviceSize)BUFFER_SIZE // size
6831 void TexelBufferInstanceBuffers::uploadData (const vk::DeviceInterface& vki, vk::VkDevice device, const vk::Allocation& memory, const de::ArrayBuffer<deUint8>& data)
6865 vk::VkDescriptorType descriptorType,
6866 vk::VkShaderStageFlags stageFlags,
6871 static vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (const vk::DeviceInterface& vki,
6872 vk::VkDevice device,
6873 vk::VkDescriptorType descriptorType,
6875 vk::VkShaderStageFlags stageFlags,
6878 static vk::Move<vk::VkPipelineLayout> createPipelineLayout (const vk::DeviceInterface& vki,
6879 vk::VkDevice device,
6880 vk::VkDescriptorSetLayout descriptorSetLayout);
6882 static vk::Move<vk::VkDescriptorPool> createDescriptorPool (const vk::DeviceInterface& vki,
6883 vk::VkDevice device,
6884 vk::VkDescriptorType descriptorType,
6887 static vk::Move<vk::VkDescriptorSet> createDescriptorSet (const vk::DeviceInterface& vki,
6889 vk::VkDevice device,
6890 vk::VkDescriptorType descriptorType,
6892 vk::VkDescriptorSetLayout layout,
6893 vk::VkDescriptorPool pool,
6894 vk::VkBufferView viewA,
6895 vk::VkBufferView viewB,
6896 vk::DescriptorSetUpdateBuilder& updateBuilder,
6897 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
6899 vk::VkPipelineLayout pipelineLayout = DE_NULL);
6901 static void writeDescriptorSet (const vk::DeviceInterface& vki,
6902 vk::VkDevice device,
6903 vk::VkDescriptorType descriptorType,
6905 vk::VkDescriptorSetLayout layout,
6906 vk::VkDescriptorPool pool,
6907 vk::VkBufferView viewA,
6908 vk::VkBufferView viewB,
6909 vk::VkDescriptorSet descriptorSet,
6910 vk::DescriptorSetUpdateBuilder& updateBuilder,
6913 static void writeDescriptorSetWithTemplate (const vk::DeviceInterface& vki,
6914 vk::VkDevice device,
6915 vk::VkDescriptorType descriptorType,
6917 vk::VkDescriptorSetLayout layout,
6918 vk::VkDescriptorPool pool,
6919 vk::VkBufferView viewA,
6920 vk::VkBufferView viewB,
6921 vk::VkDescriptorSet descriptorSet,
6922 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
6925 vk::VkPipelineLayout pipelineLayout = 0);
6928 vk::VkPipelineLayout getPipelineLayout (void) const;
6929 void writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const;
6938 const vk::VkDescriptorType m_descriptorType;
6939 const vk::VkShaderStageFlags m_stageFlags;
6943 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
6945 vk::DescriptorSetUpdateBuilder m_updateBuilder;
6946 const vk::Unique<vk::VkDescriptorSetLayout> m_descriptorSetLayout;
6947 const vk::Unique<vk::VkPipelineLayout> m_pipelineLayout;
6949 const vk::Unique<vk::VkDescriptorPool> m_descriptorPool;
6950 const vk::Unique<vk::VkDescriptorSet> m_descriptorSet;
6956 vk::VkDescriptorType descriptorType,
6957 vk::VkShaderStageFlags stageFlags,
6977 vk::Move<vk::VkDescriptorSetLayout> TexelBufferRenderInstance::createDescriptorSetLayout (const vk::DeviceInterface& vki,
6978 vk::VkDevice device,
6979 vk::VkDescriptorType descriptorType,
6981 vk::VkShaderStageFlags stageFlags,
6984 vk::DescriptorSetLayoutBuilder builder;
6985 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
6990 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
7015 vk::Move<vk::VkPipelineLayout> TexelBufferRenderInstance::createPipelineLayout (const vk::DeviceInterface& vki,
7016 vk::VkDevice device,
7017 vk::VkDescriptorSetLayout descriptorSetLayout)
7019 const vk::VkPipelineLayoutCreateInfo createInfo =
7021 vk::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
7023 (vk::VkPipelineLayoutCreateFlags)0,
7029 return vk::createPipelineLayout(vki, device, &createInfo);
7032 vk::Move<vk::VkDescriptorPool> TexelBufferRenderInstance::createDescriptorPool (const vk::DeviceInterface& vki,
7033 vk::VkDevice device,
7034 vk::VkDescriptorType descriptorType,
7037 return vk::DescriptorPoolBuilder()
7039 .build(vki, device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
7042 vk::Move<vk::VkDescriptorSet> TexelBufferRenderInstance::createDescriptorSet (const vk::DeviceInterface& vki,
7044 vk::VkDevice device,
7045 vk::VkDescriptorType descriptorType,
7047 vk::VkDescriptorSetLayout layout,
7048 vk::VkDescriptorPool pool,
7049 vk::VkBufferView viewA,
7050 vk::VkBufferView viewB,
7051 vk::DescriptorSetUpdateBuilder& updateBuilder,
7052 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
7054 vk::VkPipelineLayout pipelineLayout)
7056 const vk::VkDescriptorSetAllocateInfo allocInfo =
7058 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
7065 vk::Move<vk::VkDescriptorSet> descriptorSet;
7072 descriptorSet = vk::Move<vk::VkDescriptorSet>();
7095 void TexelBufferRenderInstance::writeDescriptorSet (const vk::DeviceInterface& vki,
7096 vk::VkDevice device,
7097 vk::VkDescriptorType descriptorType,
7099 vk::VkDescriptorSetLayout layout,
7100 vk::VkDescriptorPool pool,
7101 vk::VkBufferView viewA,
7102 vk::VkBufferView viewB,
7103 vk::VkDescriptorSet descriptorSet,
7104 vk::DescriptorSetUpdateBuilder& updateBuilder,
7109 const vk::VkBufferView texelBufferInfos[2] =
7118 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &texelBufferInfos[0]);
7122 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, &texelBufferInfos[0]);
7123 updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), descriptorType, &texelBufferInfos[1]);
7127 updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), descriptorType, 2u, texelBufferInfos);
7140 vk::DeviceInterface& vki,
7141 vk::VkDevice device,
7142 vk::VkDescriptorType descriptorType,
7144 vk::VkDescriptorSetLayout layout,
7145 vk::VkDescriptorPool pool,
7146 vk::VkBufferView viewA,
7147 vk::VkBufferView viewB,
7148 vk::VkDescriptorSet descriptorSet,
7149 vk::Move<vk::VkDescriptorUpdateTemplate>& updateTemplate,
7152 vk::VkPipelineLayout pipelineLayout)
7155 const vk::VkBufferView texelBufferInfos[2] =
7160 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
7161 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
7163 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
7168 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
7170 vk::VK_PIPELINE_BIND_POINT_GRAPHICS,
7199 updateTemplate = vk::createDescriptorUpdateTemplate(vki, device, &templateCreateInfo);
7217 << " descriptor(s) of type " << vk::getDescriptorTypeName(m_descriptorType) << "\n"
7219 << "Buffer format is " << vk::getFormatName(vk::mapTextureFormat(m_texelBuffers.getTextureFormat())) << ".\n";
7243 << (((m_stageFlags & vk::VK_SHADER_STAGE_VERTEX_BIT) != 0) ? (" vertex") : (""))
7244 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) != 0) ? (" tess_control") : (""))
7245 << (((m_stageFlags & vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0) ? (" tess_evaluation") : (""))
7246 << (((m_stageFlags & vk::VK_SHADER_STAGE_GEOMETRY_BIT) != 0) ? (" geometry") : (""))
7247 << (((m_stageFlags & vk::VK_SHADER_STAGE_FRAGMENT_BIT) != 0) ? (" fragment") : (""))
7257 vk::VkPipelineLayout TexelBufferRenderInstance::getPipelineLayout (void) const
7262 void TexelBufferRenderInstance::writeDrawCmdBuffer (vk::VkCommandBuffer cmd) const
7266 m_vki.cmdBindDescriptorSets(cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, getPipelineLayout(), 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
7274 m_updateBuilder.updateWithPush(m_vki, cmd, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0);
7304 vk::VkDescriptorType descriptorType,
7309 vk::Move<vk::VkDescriptorSetLayout> createDescriptorSetLayout (void) const;
7310 vk::Move<vk::VkDescriptorPool> createDescriptorPool (void) const;
7311 vk::Move<vk::VkDescriptorSet> createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout);
7312 void writeDescriptorSet (vk::VkDescriptorSet descriptorSet);
7313 void writeDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush = false, vk::VkPipelineLayout pipelineLayout = DE_NULL);
7320 const vk::VkDescriptorType m_descriptorType;
7324 const vk::DeviceInterface& m_vki;
7325 const vk::VkDevice m_device;
7326 const vk::VkQueue m_queue;
7328 vk::Allocator& m_allocator;
7329 vk::Move<vk::VkDescriptorUpdateTemplate> m_updateTemplate;
7335 vk::DescriptorSetUpdateBuilder m_updateBuilder;
7340 vk::VkDescriptorType descriptorType,
7361 vk::Move<vk::VkDescriptorSetLayout> TexelBufferComputeInstance::createDescriptorSetLayout (void) const
7363 vk::DescriptorSetLayoutBuilder builder;
7364 vk::VkDescriptorSetLayoutCreateFlags extraFlags = 0;
7369 extraFlags |= vk::VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR;
7372 builder.addSingleBinding(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::VK_SHADER_STAGE_COMPUTE_BIT);
7377 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
7381 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
7382 builder.addSingleBinding(m_descriptorType, vk::VK_SHADER_STAGE_COMPUTE_BIT);
7386 builder.addArrayBinding(m_descriptorType, 2u, vk::VK_SHADER_STAGE_COMPUTE_BIT);
7396 vk::Move<vk::VkDescriptorPool> TexelBufferComputeInstance::createDescriptorPool (void) const
7398 return vk::DescriptorPoolBuilder()
7399 .addType(vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
7401 .build(m_vki, m_device, vk::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1);
7404 vk::Move<vk::VkDescriptorSet> TexelBufferComputeInstance::createDescriptorSet (vk::VkDescriptorPool pool, vk::VkDescriptorSetLayout layout)
7406 const vk::VkDescriptorSetAllocateInfo allocInfo =
7408 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
7415 vk::Move<vk::VkDescriptorSet> descriptorSet;
7422 descriptorSet = vk::Move<vk::VkDescriptorSet>();
7438 void TexelBufferComputeInstance::writeDescriptorSet (vk::VkDescriptorSet descriptorSet)
7440 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
7441 const vk::VkBufferView texelBufferInfos[2] =
7448 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &resultInfo);
7454 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, &texelBufferInfos[0]);
7458 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, &texelBufferInfos[0]);
7459 m_updateBuilder.writeSingle(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(2u), m_descriptorType, &texelBufferInfos[1]);
7463 m_updateBuilder.writeArray(descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(1u), m_descriptorType, 2u, texelBufferInfos);
7476 void TexelBufferComputeInstance::writeDescriptorSetWithTemplate (vk::VkDescriptorSet descriptorSet, vk::VkDescriptorSetLayout layout, bool withPush, vk::VkPipelineLayout pipelineLayout)
7478 const vk::VkDescriptorBufferInfo resultInfo = vk::makeDescriptorBufferInfo(m_result.getBuffer(), 0u, (vk::VkDeviceSize)ComputeInstanceResultBuffer::DATA_SIZE);
7479 const vk::VkBufferView texelBufferInfos[2] =
7484 std::vector<vk::VkDescriptorUpdateTemplateEntry> updateEntries;
7485 vk::VkDescriptorUpdateTemplateCreateInfo templateCreateInfo =
7487 vk::VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR,
7492 withPush ? vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR : vk::VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
7494 vk::VK_PIPELINE_BIND_POINT_COMPUTE,
7503 updateEntries.push_back(createTemplateBinding(0, 0, 1, vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, m_updateRegistry.getWriteObjectOffset(0), 0));
7528 m_updateTemplate = vk::createDescriptorUpdateTemplate(m_vki, m_device, &templateCreateInfo);
7552 << " descriptor(s) of type " << vk::getDescriptorTypeName(m_descriptorType) << "\n"
7554 << "Buffer format is " << vk::getFormatName(vk::mapTextureFormat(m_texelBuffers.getTextureFormat())) << ".\n";
7577 const vk::Unique<vk::VkDescriptorSetLayout> descriptorSetLayout (createDescriptorSetLayout());
7578 const vk::Unique<vk::VkDescriptorPool> descriptorPool (createDescriptorPool());
7579 const vk::Unique<vk::VkDescriptorSet> descriptorSet (createDescriptorSet(*descriptorPool, *descriptorSetLayout));
7582 const vk::VkDescriptorSet descriptorSets[] = { *descriptorSet };
7586 const vk::VkBufferMemoryBarrier* const preBarriers = m_texelBuffers.getBufferInitBarriers();
7588 const vk::VkBufferMemoryBarrier* const postBarriers = m_result.getResultReadBarrier();
7672 vk::VkDescriptorType descriptorType,
7673 vk::VkShaderStageFlags exitingStages,
7674 vk::VkShaderStageFlags activeStages,
7679 std::string genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const;
7680 std::string genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const;
7681 std::string genResourceAccessSource (vk::VkShaderStageFlagBits stage) const;
7688 const vk::VkDescriptorType m_descriptorType;
7698 vk::VkDescriptorType descriptorType,
7699 vk::VkShaderStageFlags exitingStages,
7700 vk::VkShaderStageFlags activeStages,
7712 std::string TexelBufferDescriptorCase::genExtensionDeclarations (vk::VkShaderStageFlagBits stage) const
7718 std::string TexelBufferDescriptorCase::genResourceDeclarations (vk::VkShaderStageFlagBits stage, int numUsedBindings) const
7744 std::string TexelBufferDescriptorCase::genResourceAccessSource (vk::VkShaderStageFlagBits stage) const
7783 if (m_exitingStages == vk::VK_SHADER_STAGE_COMPUTE_BIT)
7795 vk::VkDescriptorType descriptorType,
7796 vk::VkShaderStageFlags exitingStages,
7797 vk::VkShaderStageFlags activeStages,
7803 vk::VkImageViewType viewType;
7809 { vk::VK_IMAGE_VIEW_TYPE_1D, "1d", "1D image view", 0u },
7810 { vk::VK_IMAGE_VIEW_TYPE_1D, "1d_base_mip", "1D image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7811 { vk::VK_IMAGE_VIEW_TYPE_1D, "1d_base_slice", "1D image subview with base array slice", ImageDescriptorCase::FLAG_BASE_SLICE },
7813 { vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY, "1d_array", "1D array image view", 0u },
7814 { vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY, "1d_array_base_mip", "1D array image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7815 { vk::VK_IMAGE_VIEW_TYPE_1D_ARRAY, "1d_array_base_slice", "1D array image subview with base array slice", ImageDescriptorCase::FLAG_BASE_SLICE },
7817 { vk::VK_IMAGE_VIEW_TYPE_2D, "2d", "2D image view", 0u },
7818 { vk::VK_IMAGE_VIEW_TYPE_2D, "2d_base_mip", "2D image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7819 { vk::VK_IMAGE_VIEW_TYPE_2D, "2d_base_slice", "2D image subview with base array slice", ImageDescriptorCase::FLAG_BASE_SLICE },
7821 { vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY, "2d_array", "2D array image view", 0u },
7822 { vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY, "2d_array_base_mip", "2D array image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7823 { vk::VK_IMAGE_VIEW_TYPE_2D_ARRAY, "2d_array_base_slice", "2D array image subview with base array slice", ImageDescriptorCase::FLAG_BASE_SLICE },
7825 { vk::VK_IMAGE_VIEW_TYPE_3D, "3d", "3D image view", 0u },
7826 { vk::VK_IMAGE_VIEW_TYPE_3D, "3d_base_mip", "3D image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7829 { vk::VK_IMAGE_VIEW_TYPE_CUBE, "cube", "Cube image view", 0u },
7830 { vk::VK_IMAGE_VIEW_TYPE_CUBE, "cube_base_mip", "Cube image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7831 { vk::VK_IMAGE_VIEW_TYPE_CUBE, "cube_base_slice", "Cube image subview with base array slice", ImageDescriptorCase::FLAG_BASE_SLICE },
7833 { vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, "cube_array", "Cube image view", 0u },
7834 { vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, "cube_array_base_mip", "Cube image subview with base mip level", ImageDescriptorCase::FLAG_BASE_MIP },
7835 { vk::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, "cube_array_base_slice", "Cube image subview with base array slice", ImageDescriptorCase::FLAG_BASE_SLICE },
7849 (descriptorType != vk::VK_DESCRIPTOR_TYPE_SAMPLER || activeStages == vk::VK_SHADER_STAGE_COMPUTE_BIT))
7869 vk::VkDescriptorType descriptorType,
7870 vk::VkShaderStageFlags exitingStages,
7871 vk::VkShaderStageFlags activeStages,
7910 vk::VkDescriptorType descriptorType,
7911 vk::VkShaderStageFlags exitingStages,
7912 vk::VkShaderStageFlags activeStages,
7994 const vk::VkDescriptorType descriptorType;
8000 { vk::VK_DESCRIPTOR_TYPE_SAMPLER, "sampler_mutable", "VK_DESCRIPTOR_TYPE_SAMPLER with mutable sampler", 0u },
8001 { vk::VK_DESCRIPTOR_TYPE_SAMPLER, "sampler_immutable", "VK_DESCRIPTOR_TYPE_SAMPLER with immutable sampler", RESOURCE_FLAG_IMMUTABLE_SAMPLER },
8002 { vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "combined_image_sampler_mutable", "VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER with mutable sampler", 0u },
8003 { vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, "combined_image_sampler_immutable", "VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER with immutable sampler", RESOURCE_FLAG_IMMUTABLE_SAMPLER },
8005 //{ vk::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, "sampled_image", "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE", 0u },
8006 { vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, "storage_image", "VK_DESCRIPTOR_TYPE_STORAGE_IMAGE", 0u },
8007 { vk::VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, "uniform_texel_buffer", "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER", 0u },
8008 { vk::VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "storage_texel_buffer", "VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER", 0u },
8009 { vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, "uniform_buffer", "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER", 0u },
8010 { vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, "storage_buffer", "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER", 0u },
8011 { vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, "uniform_buffer_dynamic", "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC", 0u },
8012 { vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, "storage_buffer_dynamic", "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC", 0u },
8018 vk::VkShaderStageFlags existingStages; //!< stages that exists
8019 vk::VkShaderStageFlags activeStages; //!< stages that access resource
8026 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8033 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8034 vk::VK_SHADER_STAGE_VERTEX_BIT,
8040 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8041 vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
8047 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8048 vk::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
8054 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_GEOMETRY_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8055 vk::VK_SHADER_STAGE_GEOMETRY_BIT,
8061 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8062 vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8068 vk::VK_SHADER_STAGE_COMPUTE_BIT,
8069 vk::VK_SHADER_STAGE_COMPUTE_BIT,
8075 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8076 vk::VK_SHADER_STAGE_VERTEX_BIT | vk::VK_SHADER_STAGE_FRAGMENT_BIT,
8122 vk::VkDescriptorType descriptorType,
8123 vk::VkShaderStageFlags existingStages,
8124 vk::VkShaderStageFlags activeStages,
8130 case vk::VK_DESCRIPTOR_TYPE_SAMPLER:
8131 case vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
8132 case vk::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
8136 case vk::VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
8137 case vk::VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
8141 case vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
8142 case vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
8143 case vk::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
8144 case vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: