Merge remote-tracking branch 'khronos/master' into deqp-dev
authorChris Forbes <chrisforbes@google.com>
Fri, 16 Nov 2018 19:32:07 +0000 (11:32 -0800)
committerChris Forbes <chrisforbes@google.com>
Fri, 16 Nov 2018 19:32:07 +0000 (11:32 -0800)
Change-Id: Iccdbde76e6b4282877b4b329cc0f9400c8e334e6

22 files changed:
android/cts/master/vk-master.txt
external/fetch_sources.py
external/openglcts/modules/gl/gl4cGlSpirvTests.cpp
external/vulkancts/modules/vulkan/api/vktApiDescriptorPoolTests.cpp
external/vulkancts/modules/vulkan/image/vktImageMutableTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemBlitImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemClearColorImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemCopyImageTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemShaderImageAccessTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemStorageBufferTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemWsiSwapchainTests.cpp
external/vulkancts/modules/vulkan/protected_memory/vktProtectedMemYCbCrConversionTests.cpp
external/vulkancts/modules/vulkan/renderpass/vktRenderPassMultisampleResolveTests.cpp
external/vulkancts/modules/vulkan/renderpass/vktRenderPassTests.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.cpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmGraphicsShaderTestUtil.hpp
external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp
external/vulkancts/mustpass/1.1.2/src/master.txt
external/vulkancts/mustpass/1.1.2/vk-default-no-waivers.txt
external/vulkancts/mustpass/1.1.2/vk-default.txt
external/vulkancts/mustpass/1.1.3/vk-default-no-waivers.txt
external/vulkancts/mustpass/1.1.3/vk-default.txt

index 30f6755..17a4f95 100755 (executable)
@@ -221748,6 +221748,7 @@ dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ulessthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.sgreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ugreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.iequal
+dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.inotequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicaland
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalor
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalequal
@@ -223200,6 +223201,9 @@ dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_t
 dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom
 dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag
 dEQP-VK.spirv_assembly.instruction.graphics.module.same_module
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_geom
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_tessc_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_tessc_tesse_geom
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse1_frag1
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse1_frag2
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse2_frag1
@@ -223577,6 +223581,11 @@ dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_geom
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_frag
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_vert
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_geom
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_frag
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_vert
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tesse
index 43e051c..3ecf97f 100644 (file)
@@ -258,18 +258,18 @@ PACKAGES = [
        GitRepo(
                "https://github.com/KhronosGroup/SPIRV-Tools.git",
                None,
-               "dd1e837e1ceffbb6445774b4c2ecb18862429ddb",
+               "9d699f6d4038f432c55310d5d0b4a6d507c1b686",
                "spirv-tools"),
        GitRepo(
                "https://github.com/KhronosGroup/glslang.git",
                None,
-               "e9405d0b443a1849fa55b7bfeaceda586a1c37af",
+               "0a339ec20c2c8ce2bbd4b3c6cb7d728785643129",
                "glslang",
                removeTags = ['master-tot']),
        GitRepo(
                "https://github.com/KhronosGroup/SPIRV-Headers.git",
                None,
-               "d5b2e1255f706ce1f88812217e9a554f299848af",
+               "a2c529b5dda18838ab4b52f816acfebd774eaab3",
                "spirv-headers"),
 ]
 
index df2b9b4..f737779 100644 (file)
@@ -839,6 +839,7 @@ void SpirvShaderBinaryMultipleShaderObjectsTest::init()
                          "OpMemoryModel Logical GLSL450\n"
                          "OpEntryPoint Vertex %mainv \"mainv\" %_ %position %gl_VertexID %gl_InstanceID\n"
                          "OpEntryPoint Fragment %mainf \"mainf\" %fColor\n"
+                         "OpExecutionMode %mainf OriginLowerLeft\n"
                          "OpSource GLSL 450\n"
                          "OpName %mainv \"mainv\"\n"
                          "OpName %mainf \"mainf\"\n"
index 03d7c57..39cf3dc 100644 (file)
@@ -144,6 +144,7 @@ tcu::TestStatus resetDescriptorPoolTest (Context& context, const ResetDescriptor
 
                        for (deUint32 ndx = 0; ndx < params.m_numIterations; ++ndx)
                        {
+                               if (ndx % 1024 == 0) context.getTestContext().touchWatchdog();
                                // The test should crash in this loop at some point if there is a memory leak
                                VK_CHECK(vkd.allocateDescriptorSets(device, &descriptorSetInfo, &testSets[0]));
                                if (params.m_freeDescriptorSets)
index bd39ef9..f60271f 100644 (file)
@@ -132,10 +132,10 @@ static const Vec4 COLOR_TABLE_FLOAT[COLOR_TABLE_SIZE]     =
 // format.
 static const IVec4     COLOR_TABLE_INT[COLOR_TABLE_SIZE]       =
 {
-       IVec4(112,  60, 101,  41),
-       IVec4( 60, 101,  41, 112),
-       IVec4( 41, 112,  60, 101),
-       IVec4(101,  41, 112,  60),
+       IVec4(0x70707070, 0x3C3C3C3C, 0x65656565, 0x29292929),
+       IVec4(0x3C3C3C3C, 0x65656565, 0x29292929, 0x70707070),
+       IVec4(0x29292929, 0x70707070, 0x3C3C3C3C, 0x65656565),
+       IVec4(0x65656565, 0x29292929, 0x70707070, 0x3C3C3C3C),
 };
 
 // Reference clear colors created from the color table values
@@ -147,20 +147,61 @@ static const VkClearValue REFERENCE_CLEAR_COLOR_FLOAT[COLOR_TABLE_SIZE]   =
        makeClearValueColorF32(COLOR_TABLE_FLOAT[3].x(), COLOR_TABLE_FLOAT[3].y(), COLOR_TABLE_FLOAT[3].z(), COLOR_TABLE_FLOAT[3].w()),
 };
 
-static const VkClearValue REFERENCE_CLEAR_COLOR_INT[COLOR_TABLE_SIZE]  =
-{
-       makeClearValueColorI32(COLOR_TABLE_INT[0].x(), COLOR_TABLE_INT[0].y(), COLOR_TABLE_INT[0].z(), COLOR_TABLE_INT[0].w()),
-       makeClearValueColorI32(COLOR_TABLE_INT[1].x(), COLOR_TABLE_INT[1].y(), COLOR_TABLE_INT[1].z(), COLOR_TABLE_INT[1].w()),
-       makeClearValueColorI32(COLOR_TABLE_INT[2].x(), COLOR_TABLE_INT[2].y(), COLOR_TABLE_INT[2].z(), COLOR_TABLE_INT[2].w()),
-       makeClearValueColorI32(COLOR_TABLE_INT[3].x(), COLOR_TABLE_INT[3].y(), COLOR_TABLE_INT[3].z(), COLOR_TABLE_INT[3].w()),
-};
-
 static const Texture s_textures[] =
 {
        Texture(IMAGE_TYPE_2D,                  tcu::IVec3(32, 32, 1),  1),
        Texture(IMAGE_TYPE_2D_ARRAY,    tcu::IVec3(32, 32, 1),  4),
 };
 
+static VkClearValue getClearValueInt(const CaseDef& caseDef, deUint32 colorTableIndex)
+{
+       VkClearValue            clearValue;
+       deUint32                        channelMask     = 0;
+
+       if (caseDef.upload == UPLOAD_DRAW)
+       {
+               // We use this mask to get small color values in the vertex buffer and
+               // avoid possible round off errors from int-to-float conversions.
+               channelMask = 0xFFu;
+       }
+       else
+       {
+               VkFormat                        format;
+               tcu::TextureFormat      tcuFormat;
+
+               // Select a mask such that no integer-based color values end up
+               // reinterpreted as NaN/Inf/denorm values.
+               if (caseDef.upload == UPLOAD_CLEAR || caseDef.upload == UPLOAD_COPY)
+                       format = caseDef.imageFormat;
+               else
+                       format = caseDef.viewFormat;
+
+               tcuFormat = mapVkFormat(format);
+
+               switch (getChannelSize(tcuFormat.type))
+               {
+                       case 1: // 8-bit
+                               channelMask = 0xFFu;
+                               break;
+                       case 2: // 16-bit
+                               channelMask = 0xFFFFu;
+                               break;
+                       case 4: // 32-bit
+                               channelMask = 0xFFFFFFFFu;
+                               break;
+                       default:
+                               DE_ASSERT(0);
+               }
+       }
+
+       clearValue.color.int32[0] = COLOR_TABLE_INT[colorTableIndex].x() & channelMask;
+       clearValue.color.int32[1] = COLOR_TABLE_INT[colorTableIndex].y() & channelMask;
+       clearValue.color.int32[2] = COLOR_TABLE_INT[colorTableIndex].z() & channelMask;
+       clearValue.color.int32[3] = COLOR_TABLE_INT[colorTableIndex].w() & channelMask;
+
+       return clearValue;
+}
+
 VkImageType getImageType (const ImageType textureImageType)
 {
        switch (textureImageType)
@@ -371,7 +412,11 @@ void initPrograms (SourceCollections& programCollection, const CaseDef caseDef)
                for (deUint32 idx = 0; idx < COLOR_TABLE_SIZE; idx++)
                {
                        if (isIntegerFormat)
-                               src << "     " << colorTypeStr << "(" << COLOR_TABLE_INT[idx].x() << ", " << COLOR_TABLE_INT[idx].y() << ", " << COLOR_TABLE_INT[idx].z() << ", " << COLOR_TABLE_INT[idx].w() << ")";
+                       {
+                               const VkClearValue      clearValue      = getClearValueInt(caseDef, idx);
+
+                               src << "     " << colorTypeStr << "(" << clearValue.color.int32[0] << ", " << clearValue.color.int32[1] << ", " << clearValue.color.int32[2] << ", " << clearValue.color.int32[3] << ")";
+                       }
                        else
                                src << "     " << colorTypeStr << "(" << COLOR_TABLE_FLOAT[idx].x() << ", " << COLOR_TABLE_FLOAT[idx].y() << ", " << COLOR_TABLE_FLOAT[idx].z() << ", " << COLOR_TABLE_FLOAT[idx].w() << ")";
                        if (idx < COLOR_TABLE_SIZE - 1)
@@ -776,7 +821,19 @@ vector<Vec4> genVertexData (const CaseDef& caseDef)
        for (deUint32 z = 0; z < caseDef.numLayers; z++)
        {
                const deUint32  colorIdx        = z % COLOR_TABLE_SIZE;
-               const Vec4              color           = isIntegerFormat ? COLOR_TABLE_INT[colorIdx].cast<float>() : COLOR_TABLE_FLOAT[colorIdx];
+               Vec4                    color;
+
+               if (isIntegerFormat)
+               {
+                       const VkClearValue      clearValue      = getClearValueInt(caseDef, colorIdx);
+                       const IVec4                     colorInt        (clearValue.color.int32[0], clearValue.color.int32[1], clearValue.color.int32[2], clearValue.color.int32[3]);
+
+                       color = colorInt.cast<float>();
+               }
+               else
+               {
+                       color = COLOR_TABLE_FLOAT[colorIdx];
+               }
 
                vectorData.push_back(Vec4(-1.0f, -1.0f, 0.0f, 1.0f));
                vectorData.push_back(color);
@@ -804,7 +861,12 @@ void generateExpectedImage(const tcu::PixelBufferAccess& image, const CaseDef& c
                for (int x = 0; x < size.x(); x++)
                {
                        if (isIntegerFormat)
-                                       image.setPixel(COLOR_TABLE_INT[colorIdx], x, y, z);
+                       {
+                               const VkClearValue      clearValue      = getClearValueInt(caseDef, colorIdx);
+                               const IVec4                     colorInt        (clearValue.color.int32[0], clearValue.color.int32[1], clearValue.color.int32[2], clearValue.color.int32[3]);
+
+                               image.setPixel(colorInt, x, y, z);
+                       }
                        else
                                if(isSRGBConversionRequired(caseDef))
                                        image.setPixel(tcu::linearToSRGB(COLOR_TABLE_FLOAT[colorIdx]), x, y, z);
@@ -1125,7 +1187,7 @@ void UploadDownloadExecutor::uploadClear(Context& context)
        {
                const VkImageSubresourceRange   layerSubresourceRange   = makeColorSubresourceRange(layer, 1u);
                const deUint32                                  colorIdx                                = layer % COLOR_TABLE_SIZE;
-               const VkClearColorValue                 clearColor                              = m_imageIsIntegerFormat ? REFERENCE_CLEAR_COLOR_INT[colorIdx].color : REFERENCE_CLEAR_COLOR_FLOAT[colorIdx].color;
+               const VkClearColorValue                 clearColor                              = m_imageIsIntegerFormat ? getClearValueInt(m_caseDef, colorIdx).color : REFERENCE_CLEAR_COLOR_FLOAT[colorIdx].color;
                m_vk.cmdClearColorImage(*m_cmdBuffer, m_image, requiredImageLayout, &clearColor, 1u, &layerSubresourceRange);
        }
 
@@ -1211,7 +1273,12 @@ void UploadDownloadExecutor::uploadCopy(Context& context)
                tcu::PixelBufferAccess  imageAccess     = tcu::PixelBufferAccess(tcuFormat, m_caseDef.size.x(), m_caseDef.size.y(), 1u, (deUint8*) m_uCopy.colorBufferAlloc->getHostPtr() + layerOffset);
                const deUint32                  colorIdx        = layer % COLOR_TABLE_SIZE;
                if (m_imageIsIntegerFormat)
-                       tcu::clear(imageAccess, COLOR_TABLE_INT[colorIdx]);
+               {
+                       const VkClearValue      clearValue      = getClearValueInt(m_caseDef, colorIdx);
+                       const IVec4                     colorInt        (clearValue.color.int32[0], clearValue.color.int32[1], clearValue.color.int32[2], clearValue.color.int32[3]);
+
+                       tcu::clear(imageAccess, colorInt);
+               }
                else
                        tcu::clear(imageAccess, COLOR_TABLE_FLOAT[colorIdx]);
                layerOffset += layerSize;
@@ -1333,7 +1400,7 @@ void UploadDownloadExecutor::uploadDraw(Context& context)
        // Create command buffer
        {
                {
-                       vector<VkClearValue>    clearValues             (m_caseDef.numLayers, m_viewIsIntegerFormat ? REFERENCE_CLEAR_COLOR_INT[0] : REFERENCE_CLEAR_COLOR_FLOAT[0]);
+                       vector<VkClearValue>    clearValues             (m_caseDef.numLayers, m_viewIsIntegerFormat ? getClearValueInt(m_caseDef, 0) : REFERENCE_CLEAR_COLOR_FLOAT[0]);
 
                        beginRenderPass(m_vk, *m_cmdBuffer, *m_uDraw.renderPass, *m_uDraw.framebuffer, makeRect2D(0, 0, m_caseDef.size.x(), m_caseDef.size.y()), (deUint32)clearValues.size(), &clearValues[0]);
                }
index 669826a..bed4569 100644 (file)
@@ -185,13 +185,13 @@ tcu::TestStatus BlitImageTestInstance::iterate()
                        }
                };
 
-               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                         (vk::VkDependencyFlags)0,
-                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,
-                                                         0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
-                                                         1, &startImgBarrier);
+               vk.cmdPipelineBarrier(targetCmdBuffer,                                                                  // commandBuffer
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                        // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,                           // dstStageMask
+                                                         (vk::VkDependencyFlags)0,                                                     // dependencyFlags
+                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,                       // memoryBarrierCount, pMemoryBarriers
+                                                         0, (const vk::VkBufferMemoryBarrier*)DE_NULL,         // bufferMemoryBarrierCount, pBufferMemoryBarriers
+                                                         1, &startImgBarrier);                                                         // imageMemoryBarrierCount, pImageMemoryBarriers
        }
 
        // Image clear
@@ -228,8 +228,8 @@ tcu::TestStatus BlitImageTestInstance::iterate()
                };
 
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,   // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,   // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -259,8 +259,8 @@ tcu::TestStatus BlitImageTestInstance::iterate()
                };
 
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,                   // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -293,6 +293,7 @@ tcu::TestStatus BlitImageTestInstance::iterate()
        vk.cmdBlitImage(targetCmdBuffer, **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL,
                                        **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL, 1u, &imageBlit, vk::VK_FILTER_NEAREST);
 
+       // Image barrier to change accessMask to shader read bit for destination image.
        {
                const vk::VkImageMemoryBarrier  endImgBarrier   =
                {
@@ -314,8 +315,8 @@ tcu::TestStatus BlitImageTestInstance::iterate()
                        }
                };
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,           // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,       // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index 3dce6e7..35d35e4 100644 (file)
@@ -180,18 +180,19 @@ tcu::TestStatus ClearColorImageTestInstance::iterate()
                        subresourceRange,                                                                       // subresourceRange
                };
 
-               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                         (vk::VkDependencyFlags)0,
-                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,
-                                                         0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
-                                                         1, &initializeBarrier);
+               vk.cmdPipelineBarrier(targetCmdBuffer,                                                          // commandBuffer
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,                   // dstStageMask
+                                                         (vk::VkDependencyFlags)0,                                             // dependencyFlags
+                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,               // memoryBarrierCount, pMemoryBarriers
+                                                         0, (const vk::VkBufferMemoryBarrier*)DE_NULL, // bufferMemoryBarrierCount, pBufferMemoryBarriers
+                                                         1, &initializeBarrier);                                               // imageMemoryBarrierCount, pImageMemoryBarriers
        }
 
        // Image clear
        vk.cmdClearColorImage(targetCmdBuffer, **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL, &m_clearColorValue, 1, &subresourceRange);
 
+       // Image barrier to change accessMask.
        {
                const vk::VkImageMemoryBarrier  initializeBarrier       =
                {
@@ -207,8 +208,8 @@ tcu::TestStatus ClearColorImageTestInstance::iterate()
                        subresourceRange                                                                        // subresourceRange
                };
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,           // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,       // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index ed7cc88..2ebbf72 100644 (file)
@@ -185,13 +185,13 @@ tcu::TestStatus CopyImageTestInstance::iterate()
                        }
                };
 
-               vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-                                                         (vk::VkDependencyFlags)0,
-                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,
-                                                         0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
-                                                         1, &startImgBarrier);
+               vk.cmdPipelineBarrier(targetCmdBuffer,                                                          // commandBuffer
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,               // dstStageMask
+                                                         (vk::VkDependencyFlags)0,                                             // dependencyFlags
+                                                         0, (const vk::VkMemoryBarrier*)DE_NULL,               // memoryBarrierCount, pMemoryBarriers
+                                                         0, (const vk::VkBufferMemoryBarrier*)DE_NULL, // bufferMemoryBarrierCount, pBufferMemoryBarriers
+                                                         1, &startImgBarrier);                                                 // imageMemoryBarrierCount, pImageMemoryBarriers
        }
 
        // Image clear
@@ -228,8 +228,8 @@ tcu::TestStatus CopyImageTestInstance::iterate()
                };
 
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,   // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,   // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -259,8 +259,8 @@ tcu::TestStatus CopyImageTestInstance::iterate()
                };
 
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,        // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,           // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -286,9 +286,12 @@ tcu::TestStatus CopyImageTestInstance::iterate()
                imageExtent,                                                    // VkExtent3D                           extent;
 
        };
-       vk.cmdCopyImage(targetCmdBuffer, **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL,
-                                       **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL, 1u, &copyImageRegion);
+       vk.cmdCopyImage(targetCmdBuffer,
+                                       **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL,   // srcImageLayout
+                                       **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL,              // dstImageLayout
+                                       1u, &copyImageRegion);
 
+       // Image barrier to change accessMask for destination image.
        {
                const vk::VkImageMemoryBarrier  endImgBarrier   =
                {
@@ -310,8 +313,8 @@ tcu::TestStatus CopyImageTestInstance::iterate()
                        }
                };
                vk.cmdPipelineBarrier(targetCmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TRANSFER_BIT,           // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,       // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index 6648faf..5a370b9 100644 (file)
@@ -978,8 +978,8 @@ tcu::TestStatus ImageAccessTestInstance::executeFragmentTest (void)
                };
 
                vk.cmdPipelineBarrier(*cmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                                // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,    // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -1023,8 +1023,8 @@ tcu::TestStatus ImageAccessTestInstance::executeFragmentTest (void)
                        }
                };
                vk.cmdPipelineBarrier(*cmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,    // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,                               // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index 5f0cc7b..43bbdeb 100644 (file)
@@ -140,9 +140,10 @@ void static addBufferCopyCmd (const vk::DeviceInterface&   vk,
                0u,                                                                                                     // VkDeviceSize                 offset
                VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
        };
+
        vk.cmdPipelineBarrier(cmdBuffer,
-                                                 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                 vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+                                                 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,        // srcStageMask
+                                                 vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,      // dstStageMask
                                                  (vk::VkDependencyFlags)0,
                                                  0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                  1, &dstWriteStartBarrier,
@@ -160,7 +161,7 @@ void static addBufferCopyCmd (const vk::DeviceInterface&    vk,
        {
                vk::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,            // VkStructureType              sType
                DE_NULL,                                                                                        // const void*                  pNext
-               vk::VK_ACCESS_TRANSFER_WRITE_BIT,                                       // VkAccessFlags                srcAccessMask
+               vk::VK_ACCESS_SHADER_WRITE_BIT,                                         // VkAccessFlags                srcAccessMask
                vk::VK_ACCESS_SHADER_READ_BIT,                                          // VkAccessFlags                dstAccessMask
                queueFamilyIndex,                                                                       // uint32_t                             srcQueueFamilyIndex
                queueFamilyIndex,                                                                       // uint32_t                             dstQueueFamilyIndex
@@ -169,8 +170,8 @@ void static addBufferCopyCmd (const vk::DeviceInterface&    vk,
                VK_WHOLE_SIZE,                                                                          // VkDeviceSize                 size
        };
        vk.cmdPipelineBarrier(cmdBuffer,
-                                                 vk::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-                                                 vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                                                 vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,              // srcStageMask
+                                                 vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,    // dstStageMask
                                                  (vk::VkDependencyFlags)0,
                                                  0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                  1, &dstWriteEndBarrier,
@@ -481,8 +482,8 @@ tcu::TestStatus StorageBufferTestInstance<T>::executeFragmentTest(void)
                };
 
                vk.cmdPipelineBarrier(*cmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                                // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,    // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
@@ -517,8 +518,8 @@ tcu::TestStatus StorageBufferTestInstance<T>::executeFragmentTest(void)
                        }
                };
                vk.cmdPipelineBarrier(*cmdBuffer,
-                                                         vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+                                                         vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,    // srcStageMask
+                                                         vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,                               // dstStageMask
                                                          (vk::VkDependencyFlags)0,
                                                          0, (const vk::VkMemoryBarrier*)DE_NULL,
                                                          0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
index 37c3791..509851f 100644 (file)
@@ -204,6 +204,21 @@ struct TestParameters
        {}
 };
 
+static vk::VkCompositeAlphaFlagBitsKHR firstSupportedCompositeAlpha(const vk::VkSurfaceCapabilitiesKHR& capabilities)
+{
+       deUint32 alphaMode = 1u;
+
+       for (;alphaMode < capabilities.supportedCompositeAlpha; alphaMode = alphaMode<<1u)
+       {
+               if ((alphaMode & capabilities.supportedCompositeAlpha) != 0)
+               {
+                       break;
+               }
+       }
+
+       return (vk::VkCompositeAlphaFlagBitsKHR)alphaMode;
+}
+
 std::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainParameterCases (vk::wsi::Type                                                               wsiType,
                                                                                                                                                   TestDimension                                                                dimension,
                                                                                                                                                   const ProtectedContext&                                              context,
@@ -232,7 +247,7 @@ std::vector<vk::VkSwapchainCreateInfoKHR> generateSwapchainParameterCases (vk::w
                0u,
                (const deUint32*)DE_NULL,
                defaultTransform,
-               vk::VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
+               firstSupportedCompositeAlpha(capabilities),
                vk::VK_PRESENT_MODE_FIFO_KHR,
                VK_FALSE,                                                       // clipped
                (vk::VkSwapchainKHR)0                           // oldSwapchain
@@ -703,7 +718,7 @@ vk::VkSwapchainCreateInfoKHR getBasicSwapchainParameters (vk::wsi::Type                                     wsiT
                0u,
                (const deUint32*)DE_NULL,
                transform,
-               vk::VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
+               firstSupportedCompositeAlpha(capabilities),
                vk::VK_PRESENT_MODE_FIFO_KHR,
                VK_FALSE,                                                       // clipped
                (vk::VkSwapchainKHR)0                           // oldSwapchain
@@ -1094,7 +1109,7 @@ tcu::TestStatus basicRenderTest (Context& baseCtx, vk::wsi::Type wsiType)
                                                                                                                                                          *swapchain,
                                                                                                                                                          std::numeric_limits<deUint64>::max(),
                                                                                                                                                          imageReadySemaphore,
-                                                                                                                                                         imageReadyFence,
+                                                                                                                                                         0,
                                                                                                                                                          &imageNdx);
 
                                if (acquireResult == vk::VK_SUBOPTIMAL_KHR)
@@ -1143,7 +1158,7 @@ tcu::TestStatus basicRenderTest (Context& baseCtx, vk::wsi::Type wsiType)
                                };
 
                                renderer.recordFrame(commandBuffer, imageNdx, frameNdx);
-                               VK_CHECK(vkd.queueSubmit(context.getQueue(), 1u, &submitInfo, (vk::VkFence)0));
+                               VK_CHECK(vkd.queueSubmit(context.getQueue(), 1u, &submitInfo, imageReadyFence));
                                VK_CHECK(vkd.queuePresentKHR(context.getQueue(), &presentInfo));
                        }
                }
index 376da74..bc7bfcd 100644 (file)
@@ -359,7 +359,12 @@ void uploadYCbCrImage (ProtectedContext&                                   ctx,
 
        beginCommandBuffer(vk, *cmdBuffer);
 
+       for (deUint32 planeNdx = 0; planeNdx < imageData.getDescription().numPlanes; ++planeNdx)
        {
+               const vk::VkImageAspectFlagBits aspect  = formatDesc.numPlanes > 1
+                                                                                               ? vk::getPlaneAspect(planeNdx)
+                                                                                               : vk::VK_IMAGE_ASPECT_COLOR_BIT;
+
                const vk::VkImageMemoryBarrier          preCopyBarrier  =
                {
                        vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
@@ -371,7 +376,7 @@ void uploadYCbCrImage (ProtectedContext&                                    ctx,
                        queueFamilyIndex,
                        queueFamilyIndex,
                        image,
-                       { vk::VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }
+                       { aspect, 0u, 1u, 0u, 1u }
                };
 
                vk.cmdPipelineBarrier(*cmdBuffer,
@@ -407,7 +412,12 @@ void uploadYCbCrImage (ProtectedContext&                                   ctx,
                vk.cmdCopyBufferToImage(*cmdBuffer, ***stagingBuffers[planeNdx], image, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, &copy);
        }
 
+       for (deUint32 planeNdx = 0; planeNdx < imageData.getDescription().numPlanes; ++planeNdx)
        {
+               const vk::VkImageAspectFlagBits aspect  = formatDesc.numPlanes > 1
+                                                                                               ? vk::getPlaneAspect(planeNdx)
+                                                                                               : vk::VK_IMAGE_ASPECT_COLOR_BIT;
+
                const vk::VkImageMemoryBarrier          postCopyBarrier =
                {
                        vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
@@ -419,7 +429,7 @@ void uploadYCbCrImage (ProtectedContext&                                    ctx,
                        VK_QUEUE_FAMILY_IGNORED,
                        VK_QUEUE_FAMILY_IGNORED,
                        image,
-                       { vk::VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }
+                       { aspect, 0u, 1u, 0u, 1u }
                };
 
                vk.cmdPipelineBarrier(*cmdBuffer,
index d40637b..192ce7a 100644 (file)
@@ -460,7 +460,7 @@ Move<VkRenderPass> createRenderPass (const DeviceInterface& vkd,
                                VK_ATTACHMENT_LOAD_OP_DONT_CARE,                        //  VkAttachmentLoadOp                          stencilLoadOp;                          ||  VkAttachmentLoadOp                                  stencilLoadOp;
                                VK_ATTACHMENT_STORE_OP_DONT_CARE,                       //  VkAttachmentStoreOp                         stencilStoreOp;                         ||  VkAttachmentStoreOp                                 stencilStoreOp;
                                VK_IMAGE_LAYOUT_UNDEFINED,                                      //  VkImageLayout                                       initialLayout;                          ||  VkImageLayout                                               initialLayout;
-                               VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL            //  VkImageLayout                                       finalLayout;                            ||  VkImageLayout                                               finalLayout;
+                               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL                //  VkImageLayout                                       finalLayout;                            ||  VkImageLayout                                               finalLayout;
                        );
                        const AttachmentRef attachmentRef                               //  VkAttachmentReference                                                                               ||  VkAttachmentReference2KHR
                        (
index 61d401d..b16fe00 100644 (file)
@@ -6149,7 +6149,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                {
                                                                        const VkInputAttachmentAspectReference inputAspect =
                                                                        {
-                                                                               0u,
+                                                                               1u,
                                                                                0u,
                                                                                VK_IMAGE_ASPECT_COLOR_BIT
                                                                        };
@@ -6217,6 +6217,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                deps.push_back(SubpassDependency(1, 1,
                                                                                                                                vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
                                                                                                                                vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+
                                                                                                                                vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
                                                                                                                                vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
                                                                                                                                vk::VK_DEPENDENCY_BY_REGION_BIT));
@@ -6225,7 +6226,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                {
                                                                        const VkInputAttachmentAspectReference inputAspect =
                                                                        {
-                                                                               0u,
+                                                                               1u,
                                                                                0u,
                                                                                VK_IMAGE_ASPECT_COLOR_BIT
                                                                        };
@@ -6465,19 +6466,11 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                                                                                vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
                                                                                                                                0u));
 
-                                                               deps.push_back(SubpassDependency(1, 1,
-                                                                                                                               vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-                                                                                                                               vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
-
-                                                                                                                               vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-                                                                                                                               vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
-                                                                                                                               vk::VK_DEPENDENCY_BY_REGION_BIT));
-
                                                                if (useInputAspect)
                                                                {
                                                                        const VkInputAttachmentAspectReference inputAspect =
                                                                        {
-                                                                               0u,
+                                                                               1u,
                                                                                0u,
                                                                                (isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
                                                                                        | (isStencilAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_STENCIL_BIT : 0u)
@@ -6555,7 +6548,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                {
                                                                        const VkInputAttachmentAspectReference inputAspect =
                                                                        {
-                                                                               0u,
+                                                                               1u,
                                                                                0u,
 
                                                                                (isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
@@ -6639,7 +6632,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                        {
                                                                                const VkInputAttachmentAspectReference inputAspect =
                                                                                {
-                                                                                       0u,
+                                                                                       1u,
                                                                                        0u,
 
                                                                                        (isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
@@ -6718,7 +6711,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                        {
                                                                                const VkInputAttachmentAspectReference inputAspect =
                                                                                {
-                                                                                       0u,
+                                                                                       1u,
                                                                                        0u,
 
                                                                                        (isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
@@ -6799,7 +6792,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                        {
                                                                                const VkInputAttachmentAspectReference inputAspect =
                                                                                {
-                                                                                       0u,
+                                                                                       1u,
                                                                                        0u,
 
                                                                                        (isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
@@ -6879,7 +6872,7 @@ void addFormatTests (tcu::TestCaseGroup* group, const TestConfigExternal testCon
                                                                        {
                                                                                const VkInputAttachmentAspectReference inputAspect =
                                                                                {
-                                                                                       0u,
+                                                                                       1u,
                                                                                        0u,
 
                                                                                        (isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
index f987da8..07b7cdb 100644 (file)
@@ -1401,231 +1401,287 @@ void addShaderCodeCustomFragment (vk::SourceCollections& dst, InstanceContext co
        addShaderCodeCustomFragment(dst, context, DE_NULL);
 }
 
-void createCombinedModule (vk::SourceCollections& dst, InstanceContext)
+void createCombinedModule (vk::SourceCollections& dst, InstanceContext ctx)
 {
-       // \todo [2015-12-07 awoloszyn] Make tessellation / geometry conditional
-       dst.spirvAsmSources.add("module") <<
-               "OpCapability Shader\n"
-               "OpCapability Geometry\n"
-               "OpCapability Tessellation\n"
-               "OpMemoryModel Logical GLSL450\n"
+       const bool                      useTessellation (ctx.requiredStages & (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT));
+       const bool                      useGeometry             (ctx.requiredStages & VK_SHADER_STAGE_GEOMETRY_BIT);
+       std::stringstream       combinedModule;
+       std::stringstream       opCapabilities;
+       std::stringstream       opEntryPoints;
 
-               "OpEntryPoint Vertex %vert_main \"main\" %vert_Position %vert_vtxColor %vert_color %vert_vtxPosition %vert_vertex_id %vert_instance_id\n"
-               "OpEntryPoint Geometry %geom_main \"main\" %geom_out_gl_position %geom_gl_in %geom_out_color %geom_in_color\n"
-               "OpEntryPoint TessellationControl %tessc_main \"main\" %tessc_out_color %tessc_gl_InvocationID %tessc_in_color %tessc_out_position %tessc_in_position %tessc_gl_TessLevelOuter %tessc_gl_TessLevelInner\n"
-               "OpEntryPoint TessellationEvaluation %tesse_main \"main\" %tesse_stream %tesse_gl_tessCoord %tesse_in_position %tesse_out_color %tesse_in_color \n"
-               "OpEntryPoint Fragment %frag_main \"main\" %frag_vtxColor %frag_fragColor\n"
-
-               "OpExecutionMode %geom_main Triangles\n"
-               "OpExecutionMode %geom_main OutputTriangleStrip\n"
-               "OpExecutionMode %geom_main OutputVertices 3\n"
-
-               "OpExecutionMode %tessc_main OutputVertices 3\n"
-
-               "OpExecutionMode %tesse_main Triangles\n"
-               "OpExecutionMode %tesse_main SpacingEqual\n"
-               "OpExecutionMode %tesse_main VertexOrderCcw\n"
-
-               "OpExecutionMode %frag_main OriginUpperLeft\n"
-
-               "; Vertex decorations\n"
-               "OpDecorate %vert_vtxPosition Location 2\n"
-               "OpDecorate %vert_Position Location 0\n"
-               "OpDecorate %vert_vtxColor Location 1\n"
-               "OpDecorate %vert_color Location 1\n"
-               "OpDecorate %vert_vertex_id BuiltIn VertexIndex\n"
-               "OpDecorate %vert_instance_id BuiltIn InstanceIndex\n"
-
-               "; Geometry decorations\n"
-               "OpDecorate %geom_out_gl_position BuiltIn Position\n"
-               "OpMemberDecorate %geom_per_vertex_in 0 BuiltIn Position\n"
-               "OpMemberDecorate %geom_per_vertex_in 1 BuiltIn PointSize\n"
-               "OpMemberDecorate %geom_per_vertex_in 2 BuiltIn ClipDistance\n"
-               "OpMemberDecorate %geom_per_vertex_in 3 BuiltIn CullDistance\n"
-               "OpDecorate %geom_per_vertex_in Block\n"
-               "OpDecorate %geom_out_color Location 1\n"
-               "OpDecorate %geom_in_color Location 1\n"
-
-               "; Tessellation Control decorations\n"
-               "OpDecorate %tessc_out_color Location 1\n"
-               "OpDecorate %tessc_gl_InvocationID BuiltIn InvocationId\n"
-               "OpDecorate %tessc_in_color Location 1\n"
-               "OpDecorate %tessc_out_position Location 2\n"
-               "OpDecorate %tessc_in_position Location 2\n"
-               "OpDecorate %tessc_gl_TessLevelOuter Patch\n"
-               "OpDecorate %tessc_gl_TessLevelOuter BuiltIn TessLevelOuter\n"
-               "OpDecorate %tessc_gl_TessLevelInner Patch\n"
-               "OpDecorate %tessc_gl_TessLevelInner BuiltIn TessLevelInner\n"
-
-               "; Tessellation Evaluation decorations\n"
-               "OpMemberDecorate %tesse_per_vertex_out 0 BuiltIn Position\n"
-               "OpMemberDecorate %tesse_per_vertex_out 1 BuiltIn PointSize\n"
-               "OpMemberDecorate %tesse_per_vertex_out 2 BuiltIn ClipDistance\n"
-               "OpMemberDecorate %tesse_per_vertex_out 3 BuiltIn CullDistance\n"
-               "OpDecorate %tesse_per_vertex_out Block\n"
-               "OpDecorate %tesse_gl_tessCoord BuiltIn TessCoord\n"
-               "OpDecorate %tesse_in_position Location 2\n"
-               "OpDecorate %tesse_out_color Location 1\n"
-               "OpDecorate %tesse_in_color Location 1\n"
-
-               "; Fragment decorations\n"
-               "OpDecorate %frag_fragColor Location 0\n"
-               "OpDecorate %frag_vtxColor Location 1\n"
+       // opCapabilities
+       {
+               opCapabilities << "OpCapability Shader\n";
 
-               SPIRV_ASSEMBLY_TYPES
-               SPIRV_ASSEMBLY_CONSTANTS
-               SPIRV_ASSEMBLY_ARRAYS
+               if (useGeometry)
+                       opCapabilities << "OpCapability Geometry\n";
 
-               "; Vertex Variables\n"
-               "%vert_vtxPosition = OpVariable %op_v4f32 Output\n"
-               "%vert_Position = OpVariable %ip_v4f32 Input\n"
-               "%vert_vtxColor = OpVariable %op_v4f32 Output\n"
-               "%vert_color = OpVariable %ip_v4f32 Input\n"
-               "%vert_vertex_id = OpVariable %ip_i32 Input\n"
-               "%vert_instance_id = OpVariable %ip_i32 Input\n"
-
-               "; Geometry Variables\n"
-               "%geom_per_vertex_in = OpTypeStruct %v4f32 %f32 %a1f32 %a1f32\n"
-               "%geom_a3_per_vertex_in = OpTypeArray %geom_per_vertex_in %c_u32_3\n"
-               "%geom_ip_a3_per_vertex_in = OpTypePointer Input %geom_a3_per_vertex_in\n"
-               "%geom_gl_in = OpVariable %geom_ip_a3_per_vertex_in Input\n"
-               "%geom_out_color = OpVariable %op_v4f32 Output\n"
-               "%geom_in_color = OpVariable %ip_a3v4f32 Input\n"
-               "%geom_out_gl_position = OpVariable %op_v4f32 Output\n"
-
-               "; Tessellation Control Variables\n"
-               "%tessc_out_color = OpVariable %op_a3v4f32 Output\n"
-               "%tessc_gl_InvocationID = OpVariable %ip_i32 Input\n"
-               "%tessc_in_color = OpVariable %ip_a32v4f32 Input\n"
-               "%tessc_out_position = OpVariable %op_a3v4f32 Output\n"
-               "%tessc_in_position = OpVariable %ip_a32v4f32 Input\n"
-               "%tessc_gl_TessLevelOuter = OpVariable %op_a4f32 Output\n"
-               "%tessc_gl_TessLevelInner = OpVariable %op_a2f32 Output\n"
-
-               "; Tessellation Evaluation Decorations\n"
-               "%tesse_per_vertex_out = OpTypeStruct %v4f32 %f32 %a1f32 %a1f32\n"
-               "%tesse_op_per_vertex_out = OpTypePointer Output %tesse_per_vertex_out\n"
-               "%tesse_stream = OpVariable %tesse_op_per_vertex_out Output\n"
-               "%tesse_gl_tessCoord = OpVariable %ip_v3f32 Input\n"
-               "%tesse_in_position = OpVariable %ip_a32v4f32 Input\n"
-               "%tesse_out_color = OpVariable %op_v4f32 Output\n"
-               "%tesse_in_color = OpVariable %ip_a32v4f32 Input\n"
-
-               "; Fragment Variables\n"
-               "%frag_fragColor = OpVariable %op_v4f32 Output\n"
-               "%frag_vtxColor = OpVariable %ip_v4f32 Input\n"
-
-               "; Vertex Entry\n"
-               "%vert_main = OpFunction %void None %fun\n"
-               "%vert_label = OpLabel\n"
-               "%vert_tmp_position = OpLoad %v4f32 %vert_Position\n"
-               "OpStore %vert_vtxPosition %vert_tmp_position\n"
-               "%vert_tmp_color = OpLoad %v4f32 %vert_color\n"
-               "OpStore %vert_vtxColor %vert_tmp_color\n"
-               "OpReturn\n"
-               "OpFunctionEnd\n"
+               if (useTessellation)
+                       opCapabilities << "OpCapability Tessellation\n";
+       }
 
-               "; Geometry Entry\n"
-               "%geom_main = OpFunction %void None %fun\n"
-               "%geom_label = OpLabel\n"
-               "%geom_gl_in_0_gl_position = OpAccessChain %ip_v4f32 %geom_gl_in %c_i32_0 %c_i32_0\n"
-               "%geom_gl_in_1_gl_position = OpAccessChain %ip_v4f32 %geom_gl_in %c_i32_1 %c_i32_0\n"
-               "%geom_gl_in_2_gl_position = OpAccessChain %ip_v4f32 %geom_gl_in %c_i32_2 %c_i32_0\n"
-               "%geom_in_position_0 = OpLoad %v4f32 %geom_gl_in_0_gl_position\n"
-               "%geom_in_position_1 = OpLoad %v4f32 %geom_gl_in_1_gl_position\n"
-               "%geom_in_position_2 = OpLoad %v4f32 %geom_gl_in_2_gl_position \n"
-               "%geom_in_color_0_ptr = OpAccessChain %ip_v4f32 %geom_in_color %c_i32_0\n"
-               "%geom_in_color_1_ptr = OpAccessChain %ip_v4f32 %geom_in_color %c_i32_1\n"
-               "%geom_in_color_2_ptr = OpAccessChain %ip_v4f32 %geom_in_color %c_i32_2\n"
-               "%geom_in_color_0 = OpLoad %v4f32 %geom_in_color_0_ptr\n"
-               "%geom_in_color_1 = OpLoad %v4f32 %geom_in_color_1_ptr\n"
-               "%geom_in_color_2 = OpLoad %v4f32 %geom_in_color_2_ptr\n"
-               "OpStore %geom_out_gl_position %geom_in_position_0\n"
-               "OpStore %geom_out_color %geom_in_color_0\n"
-               "OpEmitVertex\n"
-               "OpStore %geom_out_gl_position %geom_in_position_1\n"
-               "OpStore %geom_out_color %geom_in_color_1\n"
-               "OpEmitVertex\n"
-               "OpStore %geom_out_gl_position %geom_in_position_2\n"
-               "OpStore %geom_out_color %geom_in_color_2\n"
-               "OpEmitVertex\n"
-               "OpEndPrimitive\n"
-               "OpReturn\n"
-               "OpFunctionEnd\n"
+       // opEntryPoints
+       {
+               opEntryPoints << "OpEntryPoint Vertex %vert_main \"main\" %vert_Position %vert_vtxColor %vert_color %vert_vtxPosition %vert_vertex_id %vert_instance_id\n";
 
-               "; Tessellation Control Entry\n"
-               "%tessc_main = OpFunction %void None %fun\n"
-               "%tessc_label = OpLabel\n"
-               "%tessc_invocation_id = OpLoad %i32 %tessc_gl_InvocationID\n"
-               "%tessc_in_color_ptr = OpAccessChain %ip_v4f32 %tessc_in_color %tessc_invocation_id\n"
-               "%tessc_in_position_ptr = OpAccessChain %ip_v4f32 %tessc_in_position %tessc_invocation_id\n"
-               "%tessc_in_color_val = OpLoad %v4f32 %tessc_in_color_ptr\n"
-               "%tessc_in_position_val = OpLoad %v4f32 %tessc_in_position_ptr\n"
-               "%tessc_out_color_ptr = OpAccessChain %op_v4f32 %tessc_out_color %tessc_invocation_id\n"
-               "%tessc_out_position_ptr = OpAccessChain %op_v4f32 %tessc_out_position %tessc_invocation_id\n"
-               "OpStore %tessc_out_color_ptr %tessc_in_color_val\n"
-               "OpStore %tessc_out_position_ptr %tessc_in_position_val\n"
-               "%tessc_is_first_invocation = OpIEqual %bool %tessc_invocation_id %c_i32_0\n"
-               "OpSelectionMerge %tessc_merge_label None\n"
-               "OpBranchConditional %tessc_is_first_invocation %tessc_first_invocation %tessc_merge_label\n"
-               "%tessc_first_invocation = OpLabel\n"
-               "%tessc_tess_outer_0 = OpAccessChain %op_f32 %tessc_gl_TessLevelOuter %c_i32_0\n"
-               "%tessc_tess_outer_1 = OpAccessChain %op_f32 %tessc_gl_TessLevelOuter %c_i32_1\n"
-               "%tessc_tess_outer_2 = OpAccessChain %op_f32 %tessc_gl_TessLevelOuter %c_i32_2\n"
-               "%tessc_tess_inner = OpAccessChain %op_f32 %tessc_gl_TessLevelInner %c_i32_0\n"
-               "OpStore %tessc_tess_outer_0 %c_f32_1\n"
-               "OpStore %tessc_tess_outer_1 %c_f32_1\n"
-               "OpStore %tessc_tess_outer_2 %c_f32_1\n"
-               "OpStore %tessc_tess_inner %c_f32_1\n"
-               "OpBranch %tessc_merge_label\n"
-               "%tessc_merge_label = OpLabel\n"
-               "OpReturn\n"
-               "OpFunctionEnd\n"
+               if (useGeometry)
+                       opEntryPoints << "OpEntryPoint Geometry %geom_main \"main\" %geom_out_gl_position %geom_gl_in %geom_out_color %geom_in_color\n";
 
-               "; Tessellation Evaluation Entry\n"
-               "%tesse_main = OpFunction %void None %fun\n"
-               "%tesse_label = OpLabel\n"
-               "%tesse_tc_0_ptr = OpAccessChain %ip_f32 %tesse_gl_tessCoord %c_u32_0\n"
-               "%tesse_tc_1_ptr = OpAccessChain %ip_f32 %tesse_gl_tessCoord %c_u32_1\n"
-               "%tesse_tc_2_ptr = OpAccessChain %ip_f32 %tesse_gl_tessCoord %c_u32_2\n"
-               "%tesse_tc_0 = OpLoad %f32 %tesse_tc_0_ptr\n"
-               "%tesse_tc_1 = OpLoad %f32 %tesse_tc_1_ptr\n"
-               "%tesse_tc_2 = OpLoad %f32 %tesse_tc_2_ptr\n"
-               "%tesse_in_pos_0_ptr = OpAccessChain %ip_v4f32 %tesse_in_position %c_i32_0\n"
-               "%tesse_in_pos_1_ptr = OpAccessChain %ip_v4f32 %tesse_in_position %c_i32_1\n"
-               "%tesse_in_pos_2_ptr = OpAccessChain %ip_v4f32 %tesse_in_position %c_i32_2\n"
-               "%tesse_in_pos_0 = OpLoad %v4f32 %tesse_in_pos_0_ptr\n"
-               "%tesse_in_pos_1 = OpLoad %v4f32 %tesse_in_pos_1_ptr\n"
-               "%tesse_in_pos_2 = OpLoad %v4f32 %tesse_in_pos_2_ptr\n"
-               "%tesse_in_pos_0_weighted = OpVectorTimesScalar %v4f32 %tesse_in_pos_0 %tesse_tc_0\n"
-               "%tesse_in_pos_1_weighted = OpVectorTimesScalar %v4f32 %tesse_in_pos_1 %tesse_tc_1\n"
-               "%tesse_in_pos_2_weighted = OpVectorTimesScalar %v4f32 %tesse_in_pos_2 %tesse_tc_2\n"
-               "%tesse_out_pos_ptr = OpAccessChain %op_v4f32 %tesse_stream %c_i32_0\n"
-               "%tesse_in_pos_0_plus_pos_1 = OpFAdd %v4f32 %tesse_in_pos_0_weighted %tesse_in_pos_1_weighted\n"
-               "%tesse_computed_out = OpFAdd %v4f32 %tesse_in_pos_0_plus_pos_1 %tesse_in_pos_2_weighted\n"
-               "OpStore %tesse_out_pos_ptr %tesse_computed_out\n"
-               "%tesse_in_clr_0_ptr = OpAccessChain %ip_v4f32 %tesse_in_color %c_i32_0\n"
-               "%tesse_in_clr_1_ptr = OpAccessChain %ip_v4f32 %tesse_in_color %c_i32_1\n"
-               "%tesse_in_clr_2_ptr = OpAccessChain %ip_v4f32 %tesse_in_color %c_i32_2\n"
-               "%tesse_in_clr_0 = OpLoad %v4f32 %tesse_in_clr_0_ptr\n"
-               "%tesse_in_clr_1 = OpLoad %v4f32 %tesse_in_clr_1_ptr\n"
-               "%tesse_in_clr_2 = OpLoad %v4f32 %tesse_in_clr_2_ptr\n"
-               "%tesse_in_clr_0_weighted = OpVectorTimesScalar %v4f32 %tesse_in_clr_0 %tesse_tc_0\n"
-               "%tesse_in_clr_1_weighted = OpVectorTimesScalar %v4f32 %tesse_in_clr_1 %tesse_tc_1\n"
-               "%tesse_in_clr_2_weighted = OpVectorTimesScalar %v4f32 %tesse_in_clr_2 %tesse_tc_2\n"
-               "%tesse_in_clr_0_plus_col_1 = OpFAdd %v4f32 %tesse_in_clr_0_weighted %tesse_in_clr_1_weighted\n"
-               "%tesse_computed_clr = OpFAdd %v4f32 %tesse_in_clr_0_plus_col_1 %tesse_in_clr_2_weighted\n"
-               "OpStore %tesse_out_color %tesse_computed_clr\n"
-               "OpReturn\n"
-               "OpFunctionEnd\n"
+               if (useTessellation)
+               {
+                       opEntryPoints <<        "OpEntryPoint TessellationControl %tessc_main \"main\" %tessc_out_color %tessc_gl_InvocationID %tessc_in_color %tessc_out_position %tessc_in_position %tessc_gl_TessLevelOuter %tessc_gl_TessLevelInner\n"
+                                                               "OpEntryPoint TessellationEvaluation %tesse_main \"main\" %tesse_stream %tesse_gl_tessCoord %tesse_in_position %tesse_out_color %tesse_in_color \n";
+               }
 
-               "; Fragment Entry\n"
-               "%frag_main = OpFunction %void None %fun\n"
-               "%frag_label_main = OpLabel\n"
-               "%frag_tmp1 = OpLoad %v4f32 %frag_vtxColor\n"
-               "OpStore %frag_fragColor %frag_tmp1\n"
-               "OpReturn\n"
-               "OpFunctionEnd\n";
+               opEntryPoints << "OpEntryPoint Fragment %frag_main \"main\" %frag_vtxColor %frag_fragColor\n";
+       }
+
+       combinedModule  <<      opCapabilities.str()
+                                       <<      "OpMemoryModel Logical GLSL450\n"
+                                       <<      opEntryPoints.str();
+
+       if (useGeometry)
+       {
+               combinedModule <<       "OpExecutionMode %geom_main Triangles\n"
+                                                       "OpExecutionMode %geom_main OutputTriangleStrip\n"
+                                                       "OpExecutionMode %geom_main OutputVertices 3\n";
+       }
+
+       if (useTessellation)
+       {
+               combinedModule <<       "OpExecutionMode %tessc_main OutputVertices 3\n"
+                                                       "OpExecutionMode %tesse_main Triangles\n"
+                                                       "OpExecutionMode %tesse_main SpacingEqual\n"
+                                                       "OpExecutionMode %tesse_main VertexOrderCcw\n";
+       }
+
+       combinedModule <<       "OpExecutionMode %frag_main OriginUpperLeft\n"
+
+                                               "; Vertex decorations\n";
+
+       // If tessellation is used, vertex position is written by tessellation stage.
+       // Otherwise it will be written by vertex stage.
+       if (useTessellation)
+               combinedModule <<       "OpDecorate %vert_vtxPosition Location 2\n";
+       else
+               combinedModule <<       "OpDecorate %vert_vtxPosition BuiltIn Position\n";
+
+       combinedModule  <<      "OpDecorate %vert_Position Location 0\n"
+                                               "OpDecorate %vert_vtxColor Location 1\n"
+                                               "OpDecorate %vert_color Location 1\n"
+                                               "OpDecorate %vert_vertex_id BuiltIn VertexIndex\n"
+                                               "OpDecorate %vert_instance_id BuiltIn InstanceIndex\n";
+
+       if (useGeometry)
+       {
+               combinedModule <<       "; Geometry decorations\n"
+                                                       "OpDecorate %geom_out_gl_position BuiltIn Position\n"
+                                                       "OpMemberDecorate %geom_per_vertex_in 0 BuiltIn Position\n"
+                                                       "OpMemberDecorate %geom_per_vertex_in 1 BuiltIn PointSize\n"
+                                                       "OpMemberDecorate %geom_per_vertex_in 2 BuiltIn ClipDistance\n"
+                                                       "OpMemberDecorate %geom_per_vertex_in 3 BuiltIn CullDistance\n"
+                                                       "OpDecorate %geom_per_vertex_in Block\n"
+                                                       "OpDecorate %geom_out_color Location 1\n"
+                                                       "OpDecorate %geom_in_color Location 1\n";
+       }
+
+       if (useTessellation)
+       {
+               combinedModule <<       "; Tessellation Control decorations\n"
+                                                       "OpDecorate %tessc_out_color Location 1\n"
+                                                       "OpDecorate %tessc_gl_InvocationID BuiltIn InvocationId\n"
+                                                       "OpDecorate %tessc_in_color Location 1\n"
+                                                       "OpDecorate %tessc_out_position Location 2\n"
+                                                       "OpDecorate %tessc_in_position Location 2\n"
+                                                       "OpDecorate %tessc_gl_TessLevelOuter Patch\n"
+                                                       "OpDecorate %tessc_gl_TessLevelOuter BuiltIn TessLevelOuter\n"
+                                                       "OpDecorate %tessc_gl_TessLevelInner Patch\n"
+                                                       "OpDecorate %tessc_gl_TessLevelInner BuiltIn TessLevelInner\n"
+
+                                                       "; Tessellation Evaluation decorations\n"
+                                                       "OpMemberDecorate %tesse_per_vertex_out 0 BuiltIn Position\n"
+                                                       "OpMemberDecorate %tesse_per_vertex_out 1 BuiltIn PointSize\n"
+                                                       "OpMemberDecorate %tesse_per_vertex_out 2 BuiltIn ClipDistance\n"
+                                                       "OpMemberDecorate %tesse_per_vertex_out 3 BuiltIn CullDistance\n"
+                                                       "OpDecorate %tesse_per_vertex_out Block\n"
+                                                       "OpDecorate %tesse_gl_tessCoord BuiltIn TessCoord\n"
+                                                       "OpDecorate %tesse_in_position Location 2\n"
+                                                       "OpDecorate %tesse_out_color Location 1\n"
+                                                       "OpDecorate %tesse_in_color Location 1\n";
+       }
+
+       combinedModule <<       "; Fragment decorations\n"
+                                               "OpDecorate %frag_fragColor Location 0\n"
+                                               "OpDecorate %frag_vtxColor Location 1\n"
+
+                                               SPIRV_ASSEMBLY_TYPES
+                                               SPIRV_ASSEMBLY_CONSTANTS
+                                               SPIRV_ASSEMBLY_ARRAYS
+
+                                               "; Vertex Variables\n"
+                                               "%vert_vtxPosition = OpVariable %op_v4f32 Output\n"
+                                               "%vert_Position = OpVariable %ip_v4f32 Input\n"
+                                               "%vert_vtxColor = OpVariable %op_v4f32 Output\n"
+                                               "%vert_color = OpVariable %ip_v4f32 Input\n"
+                                               "%vert_vertex_id = OpVariable %ip_i32 Input\n"
+                                               "%vert_instance_id = OpVariable %ip_i32 Input\n";
+
+       if (useGeometry)
+       {
+               combinedModule <<       "; Geometry Variables\n"
+                                                       "%geom_per_vertex_in = OpTypeStruct %v4f32 %f32 %a1f32 %a1f32\n"
+                                                       "%geom_a3_per_vertex_in = OpTypeArray %geom_per_vertex_in %c_u32_3\n"
+                                                       "%geom_ip_a3_per_vertex_in = OpTypePointer Input %geom_a3_per_vertex_in\n"
+                                                       "%geom_gl_in = OpVariable %geom_ip_a3_per_vertex_in Input\n"
+                                                       "%geom_out_color = OpVariable %op_v4f32 Output\n"
+                                                       "%geom_in_color = OpVariable %ip_a3v4f32 Input\n"
+                                                       "%geom_out_gl_position = OpVariable %op_v4f32 Output\n";
+       }
+
+       if (useTessellation)
+       {
+               combinedModule <<       "; Tessellation Control Variables\n"
+                                                       "%tessc_out_color = OpVariable %op_a3v4f32 Output\n"
+                                                       "%tessc_gl_InvocationID = OpVariable %ip_i32 Input\n"
+                                                       "%tessc_in_color = OpVariable %ip_a32v4f32 Input\n"
+                                                       "%tessc_out_position = OpVariable %op_a3v4f32 Output\n"
+                                                       "%tessc_in_position = OpVariable %ip_a32v4f32 Input\n"
+                                                       "%tessc_gl_TessLevelOuter = OpVariable %op_a4f32 Output\n"
+                                                       "%tessc_gl_TessLevelInner = OpVariable %op_a2f32 Output\n"
+
+                                                       "; Tessellation Evaluation Decorations\n"
+                                                       "%tesse_per_vertex_out = OpTypeStruct %v4f32 %f32 %a1f32 %a1f32\n"
+                                                       "%tesse_op_per_vertex_out = OpTypePointer Output %tesse_per_vertex_out\n"
+                                                       "%tesse_stream = OpVariable %tesse_op_per_vertex_out Output\n"
+                                                       "%tesse_gl_tessCoord = OpVariable %ip_v3f32 Input\n"
+                                                       "%tesse_in_position = OpVariable %ip_a32v4f32 Input\n"
+                                                       "%tesse_out_color = OpVariable %op_v4f32 Output\n"
+                                                       "%tesse_in_color = OpVariable %ip_a32v4f32 Input\n";
+       }
+
+       combinedModule  <<      "; Fragment Variables\n"
+                                               "%frag_fragColor = OpVariable %op_v4f32 Output\n"
+                                               "%frag_vtxColor = OpVariable %ip_v4f32 Input\n"
+
+                                               "; Vertex Entry\n"
+                                               "%vert_main = OpFunction %void None %fun\n"
+                                               "%vert_label = OpLabel\n"
+                                               "%vert_tmp_position = OpLoad %v4f32 %vert_Position\n"
+                                               "OpStore %vert_vtxPosition %vert_tmp_position\n"
+                                               "%vert_tmp_color = OpLoad %v4f32 %vert_color\n"
+                                               "OpStore %vert_vtxColor %vert_tmp_color\n"
+                                               "OpReturn\n"
+                                               "OpFunctionEnd\n";
+
+       if (useGeometry)
+       {
+               combinedModule <<       "; Geometry Entry\n"
+                                                       "%geom_main = OpFunction %void None %fun\n"
+                                                       "%geom_label = OpLabel\n"
+                                                       "%geom_gl_in_0_gl_position = OpAccessChain %ip_v4f32 %geom_gl_in %c_i32_0 %c_i32_0\n"
+                                                       "%geom_gl_in_1_gl_position = OpAccessChain %ip_v4f32 %geom_gl_in %c_i32_1 %c_i32_0\n"
+                                                       "%geom_gl_in_2_gl_position = OpAccessChain %ip_v4f32 %geom_gl_in %c_i32_2 %c_i32_0\n"
+                                                       "%geom_in_position_0 = OpLoad %v4f32 %geom_gl_in_0_gl_position\n"
+                                                       "%geom_in_position_1 = OpLoad %v4f32 %geom_gl_in_1_gl_position\n"
+                                                       "%geom_in_position_2 = OpLoad %v4f32 %geom_gl_in_2_gl_position \n"
+                                                       "%geom_in_color_0_ptr = OpAccessChain %ip_v4f32 %geom_in_color %c_i32_0\n"
+                                                       "%geom_in_color_1_ptr = OpAccessChain %ip_v4f32 %geom_in_color %c_i32_1\n"
+                                                       "%geom_in_color_2_ptr = OpAccessChain %ip_v4f32 %geom_in_color %c_i32_2\n"
+                                                       "%geom_in_color_0 = OpLoad %v4f32 %geom_in_color_0_ptr\n"
+                                                       "%geom_in_color_1 = OpLoad %v4f32 %geom_in_color_1_ptr\n"
+                                                       "%geom_in_color_2 = OpLoad %v4f32 %geom_in_color_2_ptr\n"
+                                                       "OpStore %geom_out_gl_position %geom_in_position_0\n"
+                                                       "OpStore %geom_out_color %geom_in_color_0\n"
+                                                       "OpEmitVertex\n"
+                                                       "OpStore %geom_out_gl_position %geom_in_position_1\n"
+                                                       "OpStore %geom_out_color %geom_in_color_1\n"
+                                                       "OpEmitVertex\n"
+                                                       "OpStore %geom_out_gl_position %geom_in_position_2\n"
+                                                       "OpStore %geom_out_color %geom_in_color_2\n"
+                                                       "OpEmitVertex\n"
+                                                       "OpEndPrimitive\n"
+                                                       "OpReturn\n"
+                                                       "OpFunctionEnd\n";
+       }
+
+       if (useTessellation)
+       {
+               combinedModule <<       "; Tessellation Control Entry\n"
+                                                       "%tessc_main = OpFunction %void None %fun\n"
+                                                       "%tessc_label = OpLabel\n"
+                                                       "%tessc_invocation_id = OpLoad %i32 %tessc_gl_InvocationID\n"
+                                                       "%tessc_in_color_ptr = OpAccessChain %ip_v4f32 %tessc_in_color %tessc_invocation_id\n"
+                                                       "%tessc_in_position_ptr = OpAccessChain %ip_v4f32 %tessc_in_position %tessc_invocation_id\n"
+                                                       "%tessc_in_color_val = OpLoad %v4f32 %tessc_in_color_ptr\n"
+                                                       "%tessc_in_position_val = OpLoad %v4f32 %tessc_in_position_ptr\n"
+                                                       "%tessc_out_color_ptr = OpAccessChain %op_v4f32 %tessc_out_color %tessc_invocation_id\n"
+                                                       "%tessc_out_position_ptr = OpAccessChain %op_v4f32 %tessc_out_position %tessc_invocation_id\n"
+                                                       "OpStore %tessc_out_color_ptr %tessc_in_color_val\n"
+                                                       "OpStore %tessc_out_position_ptr %tessc_in_position_val\n"
+                                                       "%tessc_is_first_invocation = OpIEqual %bool %tessc_invocation_id %c_i32_0\n"
+                                                       "OpSelectionMerge %tessc_merge_label None\n"
+                                                       "OpBranchConditional %tessc_is_first_invocation %tessc_first_invocation %tessc_merge_label\n"
+                                                       "%tessc_first_invocation = OpLabel\n"
+                                                       "%tessc_tess_outer_0 = OpAccessChain %op_f32 %tessc_gl_TessLevelOuter %c_i32_0\n"
+                                                       "%tessc_tess_outer_1 = OpAccessChain %op_f32 %tessc_gl_TessLevelOuter %c_i32_1\n"
+                                                       "%tessc_tess_outer_2 = OpAccessChain %op_f32 %tessc_gl_TessLevelOuter %c_i32_2\n"
+                                                       "%tessc_tess_inner = OpAccessChain %op_f32 %tessc_gl_TessLevelInner %c_i32_0\n"
+                                                       "OpStore %tessc_tess_outer_0 %c_f32_1\n"
+                                                       "OpStore %tessc_tess_outer_1 %c_f32_1\n"
+                                                       "OpStore %tessc_tess_outer_2 %c_f32_1\n"
+                                                       "OpStore %tessc_tess_inner %c_f32_1\n"
+                                                       "OpBranch %tessc_merge_label\n"
+                                                       "%tessc_merge_label = OpLabel\n"
+                                                       "OpReturn\n"
+                                                       "OpFunctionEnd\n"
+
+                                                       "; Tessellation Evaluation Entry\n"
+                                                       "%tesse_main = OpFunction %void None %fun\n"
+                                                       "%tesse_label = OpLabel\n"
+                                                       "%tesse_tc_0_ptr = OpAccessChain %ip_f32 %tesse_gl_tessCoord %c_u32_0\n"
+                                                       "%tesse_tc_1_ptr = OpAccessChain %ip_f32 %tesse_gl_tessCoord %c_u32_1\n"
+                                                       "%tesse_tc_2_ptr = OpAccessChain %ip_f32 %tesse_gl_tessCoord %c_u32_2\n"
+                                                       "%tesse_tc_0 = OpLoad %f32 %tesse_tc_0_ptr\n"
+                                                       "%tesse_tc_1 = OpLoad %f32 %tesse_tc_1_ptr\n"
+                                                       "%tesse_tc_2 = OpLoad %f32 %tesse_tc_2_ptr\n"
+                                                       "%tesse_in_pos_0_ptr = OpAccessChain %ip_v4f32 %tesse_in_position %c_i32_0\n"
+                                                       "%tesse_in_pos_1_ptr = OpAccessChain %ip_v4f32 %tesse_in_position %c_i32_1\n"
+                                                       "%tesse_in_pos_2_ptr = OpAccessChain %ip_v4f32 %tesse_in_position %c_i32_2\n"
+                                                       "%tesse_in_pos_0 = OpLoad %v4f32 %tesse_in_pos_0_ptr\n"
+                                                       "%tesse_in_pos_1 = OpLoad %v4f32 %tesse_in_pos_1_ptr\n"
+                                                       "%tesse_in_pos_2 = OpLoad %v4f32 %tesse_in_pos_2_ptr\n"
+                                                       "%tesse_in_pos_0_weighted = OpVectorTimesScalar %v4f32 %tesse_in_pos_0 %tesse_tc_0\n"
+                                                       "%tesse_in_pos_1_weighted = OpVectorTimesScalar %v4f32 %tesse_in_pos_1 %tesse_tc_1\n"
+                                                       "%tesse_in_pos_2_weighted = OpVectorTimesScalar %v4f32 %tesse_in_pos_2 %tesse_tc_2\n"
+                                                       "%tesse_out_pos_ptr = OpAccessChain %op_v4f32 %tesse_stream %c_i32_0\n"
+                                                       "%tesse_in_pos_0_plus_pos_1 = OpFAdd %v4f32 %tesse_in_pos_0_weighted %tesse_in_pos_1_weighted\n"
+                                                       "%tesse_computed_out = OpFAdd %v4f32 %tesse_in_pos_0_plus_pos_1 %tesse_in_pos_2_weighted\n"
+                                                       "OpStore %tesse_out_pos_ptr %tesse_computed_out\n"
+                                                       "%tesse_in_clr_0_ptr = OpAccessChain %ip_v4f32 %tesse_in_color %c_i32_0\n"
+                                                       "%tesse_in_clr_1_ptr = OpAccessChain %ip_v4f32 %tesse_in_color %c_i32_1\n"
+                                                       "%tesse_in_clr_2_ptr = OpAccessChain %ip_v4f32 %tesse_in_color %c_i32_2\n"
+                                                       "%tesse_in_clr_0 = OpLoad %v4f32 %tesse_in_clr_0_ptr\n"
+                                                       "%tesse_in_clr_1 = OpLoad %v4f32 %tesse_in_clr_1_ptr\n"
+                                                       "%tesse_in_clr_2 = OpLoad %v4f32 %tesse_in_clr_2_ptr\n"
+                                                       "%tesse_in_clr_0_weighted = OpVectorTimesScalar %v4f32 %tesse_in_clr_0 %tesse_tc_0\n"
+                                                       "%tesse_in_clr_1_weighted = OpVectorTimesScalar %v4f32 %tesse_in_clr_1 %tesse_tc_1\n"
+                                                       "%tesse_in_clr_2_weighted = OpVectorTimesScalar %v4f32 %tesse_in_clr_2 %tesse_tc_2\n"
+                                                       "%tesse_in_clr_0_plus_col_1 = OpFAdd %v4f32 %tesse_in_clr_0_weighted %tesse_in_clr_1_weighted\n"
+                                                       "%tesse_computed_clr = OpFAdd %v4f32 %tesse_in_clr_0_plus_col_1 %tesse_in_clr_2_weighted\n"
+                                                       "OpStore %tesse_out_color %tesse_computed_clr\n"
+                                                       "OpReturn\n"
+                                                       "OpFunctionEnd\n";
+       }
+
+       combinedModule  <<      "; Fragment Entry\n"
+                                               "%frag_main = OpFunction %void None %fun\n"
+                                               "%frag_label_main = OpLabel\n"
+                                               "%frag_tmp1 = OpLoad %v4f32 %frag_vtxColor\n"
+                                               "OpStore %frag_fragColor %frag_tmp1\n"
+                                               "OpReturn\n"
+                                               "OpFunctionEnd\n";
+
+       dst.spirvAsmSources.add("module") << combinedModule.str();
 }
 
 void createMultipleEntries (vk::SourceCollections& dst, InstanceContext)
@@ -2297,7 +2353,8 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
        const int                                                                       seed                                    = context.getTestContext().getCommandLine().getBaseSeed() ^ testSpecificSeed;
        bool                                                                            supportsGeometry                = false;
        bool                                                                            supportsTessellation    = false;
-       bool                                                                            hasTessellation         = false;
+       bool                                                                            hasGeometry                             = false;
+       bool                                                                            hasTessellation                 = false;
        const bool                                                                      hasPushConstants                = !instance.pushConstants.empty();
        const deUint32                                                          numResources                    = static_cast<deUint32>(instance.resources.inputs.size() + instance.resources.outputs.size());
        const bool                                                                      needInterface                   = !instance.interfaces.empty();
@@ -2306,18 +2363,18 @@ TestStatus runAndVerifyDefaultPipeline (Context& context, InstanceContext instan
 
        supportsGeometry                = features.geometryShader == VK_TRUE;
        supportsTessellation    = features.tessellationShader == VK_TRUE;
+       hasGeometry                             = (instance.requiredStages & VK_SHADER_STAGE_GEOMETRY_BIT);
        hasTessellation                 = (instance.requiredStages & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) ||
                                                                (instance.requiredStages & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
 
-       if (hasTessellation && !supportsTessellation)
+       if (hasGeometry && !supportsGeometry)
        {
-               TCU_THROW(NotSupportedError, "Tessellation not supported");
+               TCU_THROW(NotSupportedError, "Geometry not supported");
        }
 
-       if ((instance.requiredStages & VK_SHADER_STAGE_GEOMETRY_BIT) &&
-               !supportsGeometry)
+       if (hasTessellation && !supportsTessellation)
        {
-               TCU_THROW(NotSupportedError, "Geometry not supported");
+               TCU_THROW(NotSupportedError, "Tessellation not supported");
        }
 
        // Check all required extensions are supported
index b53d2f9..a8e69b2 100644 (file)
@@ -347,7 +347,8 @@ void getInvertedDefaultColors (tcu::RGBA (&colors)[4]);
 // Creates fragments that specialize into a simple pass-through shader (of any kind).
 std::map<std::string, std::string> passthruFragments (void);
 
-void createCombinedModule (vk::SourceCollections& dst, InstanceContext);
+// Creates a combined shader module based on VkShaderStageFlagBits defined in InstanceContext
+void createCombinedModule (vk::SourceCollections& dst, InstanceContext ctx);
 
 // This has two shaders of each stage. The first
 // is a passthrough, the second inverts the color.
index bf382b6..7ca5c01 100644 (file)
@@ -2734,6 +2734,7 @@ tcu::TestCaseGroup* createSpecConstantGroup (tcu::TestContext& testCtx)
        cases.push_back(SpecConstantTwoIntCase("sgreaterthanequal",             " %i32 0",              " %i32 0",              "%bool",        "SGreaterThanEqual    %sc_0 %sc_1",                     -1000,  50,             selectFalseUsingSc,     outputInts2));
        cases.push_back(SpecConstantTwoIntCase("ugreaterthanequal",             " %i32 0",              " %i32 0",              "%bool",        "UGreaterThanEqual    %sc_0 %sc_1",                     10,             10,             selectTrueUsingSc,      outputInts2));
        cases.push_back(SpecConstantTwoIntCase("iequal",                                " %i32 0",              " %i32 0",              "%bool",        "IEqual               %sc_0 %sc_1",                     42,             24,             selectFalseUsingSc,     outputInts2));
+       cases.push_back(SpecConstantTwoIntCase("inotequal",                             " %i32 0",              " %i32 0",              "%bool",        "INotEqual            %sc_0 %sc_1",                     42,             24,             selectTrueUsingSc,      outputInts2));
        cases.push_back(SpecConstantTwoIntCase("logicaland",                    "True %bool",   "True %bool",   "%bool",        "LogicalAnd           %sc_0 %sc_1",                     0,              1,              selectFalseUsingSc,     outputInts2));
        cases.push_back(SpecConstantTwoIntCase("logicalor",                             "False %bool",  "False %bool",  "%bool",        "LogicalOr            %sc_0 %sc_1",                     1,              0,              selectTrueUsingSc,      outputInts2));
        cases.push_back(SpecConstantTwoIntCase("logicalequal",                  "True %bool",   "True %bool",   "%bool",        "LogicalEqual         %sc_0 %sc_1",                     0,              1,              selectFalseUsingSc,     outputInts2));
@@ -6698,6 +6699,7 @@ tcu::TestCaseGroup* createSpecConstantTests (tcu::TestContext& testCtx)
        cases.push_back(SpecConstantTwoIntGraphicsCase("sgreaterthanequal",             " %i32 0",              " %i32 0",              "%bool",        "SGreaterThanEqual    %sc_0 %sc_1",                             -1000,  50,             selectFalseUsingSc,     outputColors2));
        cases.push_back(SpecConstantTwoIntGraphicsCase("ugreaterthanequal",             " %i32 0",              " %i32 0",              "%bool",        "UGreaterThanEqual    %sc_0 %sc_1",                             10,             10,             selectTrueUsingSc,      outputColors2));
        cases.push_back(SpecConstantTwoIntGraphicsCase("iequal",                                " %i32 0",              " %i32 0",              "%bool",        "IEqual               %sc_0 %sc_1",                             42,             24,             selectFalseUsingSc,     outputColors2));
+       cases.push_back(SpecConstantTwoIntGraphicsCase("inotequal",                             " %i32 0",              " %i32 0",              "%bool",        "INotEqual            %sc_0 %sc_1",                             42,             24,             selectTrueUsingSc,      outputColors2));
        cases.push_back(SpecConstantTwoIntGraphicsCase("logicaland",                    "True %bool",   "True %bool",   "%bool",        "LogicalAnd           %sc_0 %sc_1",                             0,              1,              selectFalseUsingSc,     outputColors2));
        cases.push_back(SpecConstantTwoIntGraphicsCase("logicalor",                             "False %bool",  "False %bool",  "%bool",        "LogicalOr            %sc_0 %sc_1",                             1,              0,              selectTrueUsingSc,      outputColors2));
        cases.push_back(SpecConstantTwoIntGraphicsCase("logicalequal",                  "True %bool",   "True %bool",   "%bool",        "LogicalEqual         %sc_0 %sc_1",                             0,              1,              selectFalseUsingSc,     outputColors2));
@@ -7631,20 +7633,69 @@ tcu::TestCaseGroup* createModuleTests(tcu::TestContext& testCtx)
        RGBA                                                            invertedColors[4];
        de::MovePtr<tcu::TestCaseGroup>         moduleTests                     (new tcu::TestCaseGroup(testCtx, "module", "Multiple entry points into shaders"));
 
-       const ShaderElement                                     combinedPipeline[]      =
-       {
-               ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
-               ShaderElement("module", "main", VK_SHADER_STAGE_GEOMETRY_BIT),
-               ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT),
-               ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT),
-               ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
-       };
-
        getDefaultColors(defaultColors);
        getInvertedDefaultColors(invertedColors);
-       addFunctionCaseWithPrograms<InstanceContext>(
-                       moduleTests.get(), "same_module", "", createCombinedModule, runAndVerifyDefaultPipeline,
-                       createInstanceContext(combinedPipeline, map<string, string>()));
+
+       // Combined module tests
+       {
+               // Shader stages: vertex and fragment
+               {
+                       const ShaderElement combinedPipeline[]  =
+                       {
+                               ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
+                       };
+
+                       addFunctionCaseWithPrograms<InstanceContext>(
+                               moduleTests.get(), "same_module", "", createCombinedModule, runAndVerifyDefaultPipeline,
+                               createInstanceContext(combinedPipeline, map<string, string>()));
+               }
+
+               // Shader stages: vertex, geometry and fragment
+               {
+                       const ShaderElement combinedPipeline[]  =
+                       {
+                               ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_GEOMETRY_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
+                       };
+
+                       addFunctionCaseWithPrograms<InstanceContext>(
+                               moduleTests.get(), "same_module_geom", "", createCombinedModule, runAndVerifyDefaultPipeline,
+                               createInstanceContext(combinedPipeline, map<string, string>()));
+               }
+
+               // Shader stages: vertex, tessellation control, tessellation evaluation and fragment
+               {
+                       const ShaderElement combinedPipeline[]  =
+                       {
+                               ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
+                       };
+
+                       addFunctionCaseWithPrograms<InstanceContext>(
+                               moduleTests.get(), "same_module_tessc_tesse", "", createCombinedModule, runAndVerifyDefaultPipeline,
+                               createInstanceContext(combinedPipeline, map<string, string>()));
+               }
+
+               // Shader stages: vertex, tessellation control, tessellation evaluation, geometry and fragment
+               {
+                       const ShaderElement combinedPipeline[]  =
+                       {
+                               ShaderElement("module", "main", VK_SHADER_STAGE_VERTEX_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_GEOMETRY_BIT),
+                               ShaderElement("module", "main", VK_SHADER_STAGE_FRAGMENT_BIT)
+                       };
+
+                       addFunctionCaseWithPrograms<InstanceContext>(
+                               moduleTests.get(), "same_module_tessc_tesse_geom", "", createCombinedModule, runAndVerifyDefaultPipeline,
+                               createInstanceContext(combinedPipeline, map<string, string>()));
+               }
+       }
 
        const char* numbers[] =
        {
index 1031f48..68c92a4 100644 (file)
@@ -211977,6 +211977,7 @@ dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ulessthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.sgreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ugreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.iequal
+dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.inotequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicaland
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalor
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalequal
@@ -213685,6 +213686,11 @@ dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_geom
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_frag
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_vert
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_geom
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_frag
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_vert
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tesse
index 1031f48..68c92a4 100644 (file)
@@ -211977,6 +211977,7 @@ dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ulessthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.sgreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ugreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.iequal
+dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.inotequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicaland
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalor
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalequal
@@ -213685,6 +213686,11 @@ dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_geom
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_frag
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_vert
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_geom
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_frag
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_vert
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tesse
index d468055..5f4f0bd 100644 (file)
@@ -211977,6 +211977,7 @@ dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ulessthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.sgreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ugreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.iequal
+dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.inotequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicaland
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalor
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalequal
@@ -213685,6 +213686,11 @@ dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_geom
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_frag
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_vert
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_geom
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_frag
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_vert
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tesse
index 2a31734..b0e6033 100644 (file)
@@ -221753,6 +221753,7 @@ dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ulessthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.sgreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ugreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.iequal
+dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.inotequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicaland
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalor
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalequal
@@ -223201,6 +223202,9 @@ dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_t
 dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom
 dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag
 dEQP-VK.spirv_assembly.instruction.graphics.module.same_module
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_geom
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_tessc_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_tessc_tesse_geom
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse1_frag1
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse1_frag2
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse2_frag1
@@ -223578,6 +223582,11 @@ dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_geom
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_frag
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_vert
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_geom
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_frag
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_vert
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tesse
index 1d9ca4d..a9609f2 100644 (file)
@@ -221753,6 +221753,7 @@ dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ulessthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.sgreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.ugreaterthanequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.iequal
+dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.inotequal
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicaland
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalor
 dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.logicalequal
@@ -223201,6 +223202,9 @@ dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_t
 dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom
 dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag
 dEQP-VK.spirv_assembly.instruction.graphics.module.same_module
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_geom
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_tessc_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.module.same_module_tessc_tesse_geom
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse1_frag1
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse1_frag2
 dEQP-VK.spirv_assembly.instruction.graphics.module.vert1_geom1_tessc1_tesse2_frag1
@@ -223578,6 +223582,11 @@ dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_tesse
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_geom
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.iequal_frag
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_vert
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tessc
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_tesse
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_geom
+dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.inotequal_frag
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_vert
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tessc
 dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.logicaland_tesse