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
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
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
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"),
]
"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"
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)
// 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
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)
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)
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);
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);
{
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);
}
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;
// 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]);
}
}
};
- 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
};
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,
};
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,
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 =
{
}
};
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,
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 =
{
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,
}
};
- 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
};
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,
};
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,
imageExtent, // VkExtent3D extent;
};
- vk.cmdCopyImage(targetCmdBuffer, **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL,
- **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL, 1u, ©ImageRegion);
+ vk.cmdCopyImage(targetCmdBuffer,
+ **colorImageSrc, vk::VK_IMAGE_LAYOUT_GENERAL, // srcImageLayout
+ **colorImage, vk::VK_IMAGE_LAYOUT_GENERAL, // dstImageLayout
+ 1u, ©ImageRegion);
+ // Image barrier to change accessMask for destination image.
{
const vk::VkImageMemoryBarrier endImgBarrier =
{
}
};
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,
};
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,
}
};
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,
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,
{
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
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,
};
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,
}
};
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,
{}
};
+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,
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
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
*swapchain,
std::numeric_limits<deUint64>::max(),
imageReadySemaphore,
- imageReadyFence,
+ 0,
&imageNdx);
if (acquireResult == vk::VK_SUBOPTIMAL_KHR)
};
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));
}
}
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,
queueFamilyIndex,
queueFamilyIndex,
image,
- { vk::VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }
+ { aspect, 0u, 1u, 0u, 1u }
};
vk.cmdPipelineBarrier(*cmdBuffer,
vk.cmdCopyBufferToImage(*cmdBuffer, ***stagingBuffers[planeNdx], image, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ©);
}
+ 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,
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,
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
(
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
VK_IMAGE_ASPECT_COLOR_BIT
};
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));
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
VK_IMAGE_ASPECT_COLOR_BIT
};
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)
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
(isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
(isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
(isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
(isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
{
const VkInputAttachmentAspectReference inputAspect =
{
- 0u,
+ 1u,
0u,
(isDepthAttachment ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u)
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)
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();
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
// 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.
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));
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));
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[] =
{
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
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
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
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
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
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
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
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
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
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
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
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