This change removes errors reported by core validation layer.
Affects: dEQP-VK.protected_memory.*
Components: Vulkan
Change-Id: Ic258ba2af077b2dc119db0d177613558464e0c9a
<< tcu::TestLog::Message << "Stencil clear value: " << m_clearValue.depthStencil.stencil << tcu::TestLog::EndMessage;
// Validate resulting image
- if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+ if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
return tcu::TestStatus::pass("Everything went OK");
else
return tcu::TestStatus::fail("Something went really wrong");
<< tcu::TestLog::Message << "Stencil clear value: " << m_clearValue.depthStencil.stencil << tcu::TestLog::EndMessage;
// Validate resulting image
- if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+ if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
return tcu::TestStatus::pass("Everything went OK");
else
return tcu::TestStatus::fail("Something went really wrong");
vk.cmdPipelineBarrier(targetCmdBuffer,
vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+ vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
(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_TRANSFER_BIT,
+ vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
(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_TRANSFER_BIT,
(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_TRANSFER_BIT,
+ vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
<< tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage;
// Validate resulting image
- if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+ if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
return tcu::TestStatus::pass("Everything went OK");
else
return tcu::TestStatus::fail("Something went really wrong");
vk.cmdPipelineBarrier(targetCmdBuffer,
vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+ vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
(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_TRANSFER_BIT,
+ vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
<< tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage;
// Validate resulting image
- if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+ if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
return tcu::TestStatus::pass("Everything went OK");
else
return tcu::TestStatus::fail("Something went really wrong");
<< tcu::TestLog::Message << "Fill value: " << m_fillValue << tcu::TestLog::EndMessage;
// Validate resulting image
- if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+ if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
return tcu::TestStatus::pass("Everything went OK");
else
return tcu::TestStatus::fail("Something went really wrong");
vk.cmdPipelineBarrier(targetCmdBuffer,
vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+ vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
};
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,
+ vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
(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_TRANSFER_BIT,
(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_TRANSFER_BIT,
+ vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
<< tcu::TestLog::Message << "Color clear value: " << tcu::Vec4(m_clearColorValue.float32) << tcu::TestLog::EndMessage;
// Validate resulting image
- if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat))
+ if (m_validator.validateImage(ctx, m_refData, **colorImage, m_imageFormat, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))
return tcu::TestStatus::pass("Everything went OK");
else
return tcu::TestStatus::fail("Something went really wrong");
}
bool ImageValidator::validateImage (ProtectedContext& ctx, const ValidationData& refData,
- const vk::VkImage image, const vk::VkFormat imageFormat) const
+ const vk::VkImage image, const vk::VkFormat imageFormat, const vk::VkImageLayout imageLayout) const
{
// Log out a few reference info
{
{
vk::VkDescriptorBufferInfo descRefUniform = makeDescriptorBufferInfo(**refUniform, 0, refUniformSize);
vk::VkDescriptorBufferInfo descBuffer = makeDescriptorBufferInfo(**helperBuffer, 0, helperBufferSize);
- vk::VkDescriptorImageInfo descSampledImg = makeDescriptorImageInfo(*sampler, *imageView, vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+ vk::VkDescriptorImageInfo descSampledImg = makeDescriptorImageInfo(*sampler, *imageView, imageLayout);
vk::DescriptorSetUpdateBuilder()
.writeSingle(*descriptorSet, vk::DescriptorSetUpdateBuilder::Location::binding(0u), vk::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descSampledImg)
bool validateImage (ProtectedContext& ctx,
const ValidationData& refData,
const vk::VkImage image,
- const vk::VkFormat imageFormat) const;
+ const vk::VkFormat imageFormat,
+ const vk::VkImageLayout imageLayout) const;
private:
const vk::VkFormat m_imageFormat;
void uploadImage (vk::VkImage image,
const tcu::Texture2D& texture2D);
void copyToProtectedImage (vk::VkImage srcImage,
- vk::VkImage dstImage);
+ vk::VkImage dstImage,
+ vk::VkImageLayout dstImageLayout);
void calculateAtomicRef (tcu::Texture2D& texture2D);
tcu::TestStatus validateResult (vk::VkImage image,
+ vk::VkImageLayout imageLayout,
const tcu::Texture2D& texture2D,
const tcu::Sampler& refSampler);
vk.cmdCopyBufferToImage(*cmdBuffer, **stagingBuffer, image, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ©Region);
vk.cmdPipelineBarrier(*cmdBuffer,
(vk::VkPipelineStageFlags)vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
- (vk::VkPipelineStageFlags)vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+ (vk::VkPipelineStageFlags)vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
(vk::VkDependencyFlags)0u,
0u, (const vk::VkMemoryBarrier*)DE_NULL,
0u, (const vk::VkBufferMemoryBarrier*)DE_NULL,
}
}
-void ImageAccessTestInstance::copyToProtectedImage (vk::VkImage srcImage, vk::VkImage dstImage)
+void ImageAccessTestInstance::copyToProtectedImage (vk::VkImage srcImage, vk::VkImage dstImage, vk::VkImageLayout dstImageLayout)
{
ProtectedContext& ctx (m_protectedContext);
const vk::DeviceInterface& vk = ctx.getDeviceInterface();
vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
- vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
+ vk::VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask;
vk::VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout oldLayout;
- vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout;
+ dstImageLayout, // VkImageLayout newLayout;
queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
queueFamilyIndex, // deUint32 dstQueueFamilyIndex;
dstImage, // VkImage image;
vk.cmdCopyImage(*cmdBuffer, srcImage, vk::VK_IMAGE_LAYOUT_GENERAL, dstImage, vk::VK_IMAGE_LAYOUT_GENERAL, 1u, ©ImageRegion);
vk.cmdPipelineBarrier(*cmdBuffer,
vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
- vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
vk::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
DE_NULL, // const void* pNext;
vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
- vk::VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
+ vk::VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask;
vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
vk::VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout;
queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
vk.cmdClearColorImage(*cmdBuffer, image, vk::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &subresourceRange);
vk.cmdPipelineBarrier(*cmdBuffer,
vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
- vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ vk::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
0, (const vk::VkBufferMemoryBarrier*)DE_NULL,
// Upload data to an unprotected image
uploadImage(**unprotectedImage, *texture2D);
+ // Select vkImageLayout based upon accessType
+ vk::VkImageLayout imageSrcLayout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
+
+ switch (m_params.accessType)
+ {
+ case ACCESS_TYPE_SAMPLING:
+ case ACCESS_TYPE_TEXEL_FETCH:
+ {
+ imageSrcLayout = vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ break;
+ }
+ case ACCESS_TYPE_IMAGE_LOAD:
+ case ACCESS_TYPE_IMAGE_STORE:
+ case ACCESS_TYPE_IMAGE_ATOMICS:
+ {
+ imageSrcLayout = vk::VK_IMAGE_LAYOUT_GENERAL;
+ break;
+ }
+ default:
+ DE_FATAL("Impossible");
+ break;
+ }
+
// Copy unprotected image to protected image
- copyToProtectedImage(**unprotectedImage, **imageSrc);
+ copyToProtectedImage(**unprotectedImage, **imageSrc, imageSrcLayout);
}
// Clear dst image
{
const vk::VkImage resultImage = m_params.accessType == ACCESS_TYPE_IMAGE_ATOMICS ? **imageSrc : **imageDst;
- return validateResult(resultImage, *texture2D, refSampler);
+ return validateResult(resultImage, vk::VK_IMAGE_LAYOUT_GENERAL, *texture2D, refSampler);
}
}
}
}
+ // Select vkImageLayout based upon accessType
+ vk::VkImageLayout imageLayout = vk::VK_IMAGE_LAYOUT_UNDEFINED;
+
+ switch (m_params.accessType)
+ {
+ case ACCESS_TYPE_SAMPLING:
+ case ACCESS_TYPE_TEXEL_FETCH:
+ {
+ imageLayout = vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ break;
+ }
+ case ACCESS_TYPE_IMAGE_LOAD:
+ case ACCESS_TYPE_IMAGE_STORE:
+ case ACCESS_TYPE_IMAGE_ATOMICS:
+ {
+ imageLayout = vk::VK_IMAGE_LAYOUT_GENERAL;
+ break;
+ }
+ default:
+ DE_FATAL("Impossible");
+ break;
+ }
+
// Upload source image
{
de::MovePtr<vk::ImageWithMemory> unprotectedImage = createImage2D(ctx, PROTECTION_DISABLED, queueFamilyIndex,
uploadImage(**unprotectedImage, *texture2D);
// Copy unprotected image to protected image
- copyToProtectedImage(**unprotectedImage, **imageSrc);
+ copyToProtectedImage(**unprotectedImage, **imageSrc, imageLayout);
}
// Clear dst image
vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask
vk::VK_ACCESS_SHADER_READ_BIT, // dstAccessMask
vk::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // oldLayout
- vk::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // newLayout
+ imageLayout, // newLayout
queueFamilyIndex, // srcQueueFamilyIndex
queueFamilyIndex, // dstQueueFamilyIndex
**colorImage, // image
}
};
vk.cmdPipelineBarrier(*cmdBuffer,
- vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)DE_NULL,
const vk::VkImage resultImage = m_params.accessType == ACCESS_TYPE_IMAGE_ATOMICS ? **imageSrc :
m_params.accessType == ACCESS_TYPE_IMAGE_STORE ? **imageDst : **colorImage;
- return validateResult(resultImage, *texture2D, refSampler);
+ return validateResult(resultImage, imageLayout, *texture2D, refSampler);
}
}
}
}
-tcu::TestStatus ImageAccessTestInstance::validateResult (vk::VkImage image, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
+tcu::TestStatus ImageAccessTestInstance::validateResult (vk::VkImage image, vk::VkImageLayout imageLayout, const tcu::Texture2D& texture2D, const tcu::Sampler& refSampler)
{
de::Random rnd (getSeedValue(m_params));
ValidationData refData;
refData.values[ndx] = texture2D.sample(refSampler, cx, cy, lod);
}
- if (!m_validator.validateImage(m_protectedContext, refData, image, m_params.imageFormat))
+ if (!m_validator.validateImage(m_protectedContext, refData, image, m_params.imageFormat, imageLayout))
return tcu::TestStatus::fail("Something went really wrong");
else
return tcu::TestStatus::pass("Everything went OK");
};
vk.cmdPipelineBarrier(cmdBuffer,
vk::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- vk::VK_PIPELINE_STAGE_TRANSFER_BIT,
+ vk::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
(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,
+ vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
(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_COLOR_ATTACHMENT_OUTPUT_BIT,
vk::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
(vk::VkDependencyFlags)0,
0, (const vk::VkMemoryBarrier*)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));
}
}