vulkan.h: v129 -- rework clear colors, remove raw clear [#14020]
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
diff --git a/include/vulkan.h b/include/vulkan.h
index b023b69..7709843 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -2049,19 +2049,14 @@
VkRenderPassContents contents;
} VkRenderPassBegin;
-// Union allowing specification of floating point or raw color data. Actual value selected is based on image being cleared.
+// Union allowing specification of floating point, integer, or unsigned integer color data. Actual value selected is based on format.
typedef union VkClearColorValue_
{
- float floatColor[4];
- uint32_t rawColor[4];
+ float f32[4];
+ int32_t s32[4];
+ uint32_t u32[4];
} VkClearColorValue;
-typedef struct VkClearColor_
-{
- VkClearColorValue color;
- bool32_t useRawValue;
-} VkClearColor;
-
typedef struct VkRenderPassCreateInfo_
{
VkStructureType sType; // Must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
@@ -2076,7 +2071,7 @@
const VkImageLayout* pColorLayouts;
const VkAttachmentLoadOp* pColorLoadOps;
const VkAttachmentStoreOp* pColorStoreOps;
- const VkClearColor* pColorLoadClearValues;
+ const VkClearColorValue* pColorLoadClearValues;
VkFormat depthStencilFormat;
VkImageLayout depthStencilLayout;
VkAttachmentLoadOp depthLoadOp;
@@ -2253,9 +2248,9 @@
typedef void (VKAPI *PFN_vkCmdCopyImageToBuffer)(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer destBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions);
typedef void (VKAPI *PFN_vkCmdUpdateBuffer)(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize dataSize, const uint32_t* pData);
typedef void (VKAPI *PFN_vkCmdFillBuffer)(VkCmdBuffer cmdBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data);
-typedef void (VKAPI *PFN_vkCmdClearColorImage)(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
+typedef void (VKAPI *PFN_vkCmdClearColorImage)(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
typedef void (VKAPI *PFN_vkCmdClearDepthStencilImage)(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges);
-typedef void (VKAPI *PFN_vkCmdClearColorAttachment)(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rectCount, const VkRect3D* pRects);
+typedef void (VKAPI *PFN_vkCmdClearColorAttachment)(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rectCount, const VkRect3D* pRects);
typedef void (VKAPI *PFN_vkCmdClearDepthStencilAttachment)(VkCmdBuffer cmdBuffer, VkImageAspectFlags imageAspectMask, VkImageLayout imageLayout, float depth, uint32_t stencil, uint32_t rectCount, const VkRect3D* pRects);
typedef void (VKAPI *PFN_vkCmdResolveImage)(VkCmdBuffer cmdBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage destImage, VkImageLayout destImageLayout, uint32_t regionCount, const VkImageResolve* pRegions);
typedef void (VKAPI *PFN_vkCmdSetEvent)(VkCmdBuffer cmdBuffer, VkEvent event, VkPipelineStageFlags stageMask);
@@ -2836,7 +2831,7 @@
VkCmdBuffer cmdBuffer,
VkImage image,
VkImageLayout imageLayout,
- const VkClearColor* pColor,
+ const VkClearColorValue* pColor,
uint32_t rangeCount,
const VkImageSubresourceRange* pRanges);
@@ -2853,7 +2848,7 @@
VkCmdBuffer cmdBuffer,
uint32_t colorAttachment,
VkImageLayout imageLayout,
- const VkClearColor* pColor,
+ const VkClearColorValue* pColor,
uint32_t rectCount,
const VkRect3D* pRects);
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 3da7d54..fa3b36a 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -2482,7 +2482,7 @@
VK_LAYER_EXPORT void VKAPI vkCmdClearColorImage(
VkCmdBuffer cmdBuffer,
VkImage image, VkImageLayout imageLayout,
- const VkClearColor *pColor,
+ const VkClearColorValue *pColor,
uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
{
GLOBAL_CB_NODE* pCB = getCBNode(cmdBuffer);
@@ -2682,8 +2682,8 @@
memcpy((void*)localRPCI->pColorStoreOps, pCreateInfo->pColorStoreOps, localRPCI->colorAttachmentCount*sizeof(VkAttachmentStoreOp));
}
if (pCreateInfo->pColorLoadClearValues) {
- localRPCI->pColorLoadClearValues = new VkClearColor[localRPCI->colorAttachmentCount];
- memcpy((void*)localRPCI->pColorLoadClearValues, pCreateInfo->pColorLoadClearValues, localRPCI->colorAttachmentCount*sizeof(VkClearColor));
+ localRPCI->pColorLoadClearValues = new VkClearColorValue[localRPCI->colorAttachmentCount];
+ memcpy((void*)localRPCI->pColorLoadClearValues, pCreateInfo->pColorLoadClearValues, localRPCI->colorAttachmentCount*sizeof(VkClearColorValue));
}
renderPassMap[*pRenderPass] = localRPCI;
}
diff --git a/layers/image.cpp b/layers/image.cpp
index 0282795..d2c449e 100644
--- a/layers/image.cpp
+++ b/layers/image.cpp
@@ -340,10 +340,10 @@
for(uint32_t i = 0; i < pCreateInfo->colorAttachmentCount; ++i)
{
- if(!vk_validate_vkclearcolor(&(pCreateInfo->pColorLoadClearValues[i])))
+ if(!vk_validate_vkclearcolorvalue(&(pCreateInfo->pColorLoadClearValues[i])))
{
std::stringstream ss;
- ss << "vkCreateRenderPass parameter, VkClearColor pCreateInfo->pColorLoadClearValues[" << i << "], is invalid";
+ ss << "vkCreateRenderPass parameter, VkClearColorValue pCreateInfo->pColorLoadClearValues[" << i << "], is invalid";
log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, (VkObjectType)0, NULL, 0, 1, "IMAGE", ss.str().c_str());
}
}
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 0411ca1..e4db292 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -1923,7 +1923,7 @@
VkCmdBuffer cmdBuffer,
VkImage image,
VkImageLayout imageLayout,
- const VkClearColor *pColor,
+ const VkClearColorValue *pColor,
uint32_t rangeCount,
const VkImageSubresourceRange *pRanges)
{
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 643399a..3074ab1 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -8415,7 +8415,7 @@
void PreCmdClearColorImage(
VkCmdBuffer cmdBuffer,
- const VkClearColor* pColor,
+ const VkClearColorValue* pColor,
const VkImageSubresourceRange* pRanges)
{
if(cmdBuffer == nullptr)
@@ -8481,7 +8481,7 @@
VkCmdBuffer cmdBuffer,
VkImage image,
VkImageLayout imageLayout,
- const VkClearColor* pColor,
+ const VkClearColorValue* pColor,
uint32_t rangeCount,
const VkImageSubresourceRange* pRanges)
{
diff --git a/loader/trampoline.c b/loader/trampoline.c
index ef8e4f5..f2239ff 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -990,7 +990,7 @@
disp->CmdFillBuffer(cmdBuffer, destBuffer, destOffset, fillSize, data);
}
-LOADER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
+LOADER_EXPORT void VKAPI vkCmdClearColorImage(VkCmdBuffer cmdBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
{
const VkLayerDispatchTable *disp;
@@ -1008,7 +1008,7 @@
disp->CmdClearDepthStencilImage(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
}
-LOADER_EXPORT void VKAPI vkCmdClearColorAttachment(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColor* pColor, uint32_t rectCount, const VkRect3D* pRects)
+LOADER_EXPORT void VKAPI vkCmdClearColorAttachment(VkCmdBuffer cmdBuffer, uint32_t colorAttachment, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rectCount, const VkRect3D* pRects)
{
const VkLayerDispatchTable *disp;
diff --git a/tests/blit_tests.cpp b/tests/blit_tests.cpp
index 08f9dbf..e421efe 100644
--- a/tests/blit_tests.cpp
+++ b/tests/blit_tests.cpp
@@ -1164,17 +1164,13 @@
class VkCmdClearColorImageTest : public VkCmdBlitImageTest {
protected:
- VkCmdClearColorImageTest() : test_raw_(false) {}
- VkCmdClearColorImageTest(bool test_raw) : test_raw_(test_raw) {}
+ VkCmdClearColorImageTest() {}
virtual void SetUp()
{
VkCmdBlitTest::SetUp();
- if (test_raw_)
- init_test_formats();
- else
- init_test_formats(VK_FORMAT_FEATURE_CONVERSION_BIT);
+ init_test_formats(VK_FORMAT_FEATURE_CONVERSION_BIT);
ASSERT_NE(true, test_formats_.empty());
}
@@ -1184,25 +1180,23 @@
uint32_t raw[4];
};
- bool test_raw_;
-
- std::vector<uint8_t> color_to_raw(VkFormat format, const float color[4])
+ std::vector<uint8_t> color_to_raw(VkFormat format, const VkClearColorValue &color)
{
std::vector<uint8_t> raw;
// TODO support all formats
switch (format) {
case VK_FORMAT_R8G8B8A8_UNORM:
- raw.push_back((uint8_t)(color[0] * 255.0f));
- raw.push_back((uint8_t)(color[1] * 255.0f));
- raw.push_back((uint8_t)(color[2] * 255.0f));
- raw.push_back((uint8_t)(color[3] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[0] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[1] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[2] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[3] * 255.0f));
break;
case VK_FORMAT_B8G8R8A8_UNORM:
- raw.push_back((uint8_t)(color[2] * 255.0f));
- raw.push_back((uint8_t)(color[1] * 255.0f));
- raw.push_back((uint8_t)(color[0] * 255.0f));
- raw.push_back((uint8_t)(color[3] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[2] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[1] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[0] * 255.0f));
+ raw.push_back((uint8_t)(color.f32[3] * 255.0f));
break;
default:
break;
@@ -1211,41 +1205,8 @@
return raw;
}
- std::vector<uint8_t> color_to_raw(VkFormat format, const uint32_t color[4])
- {
- std::vector<uint8_t> raw;
-
- // TODO support all formats
- switch (format) {
- case VK_FORMAT_R8G8B8A8_UNORM:
- raw.push_back(static_cast<uint8_t>(color[0]));
- raw.push_back(static_cast<uint8_t>(color[1]));
- raw.push_back(static_cast<uint8_t>(color[2]));
- raw.push_back(static_cast<uint8_t>(color[3]));
- break;
- case VK_FORMAT_B8G8R8A8_UNORM:
- raw.push_back(static_cast<uint8_t>(color[2]));
- raw.push_back(static_cast<uint8_t>(color[1]));
- raw.push_back(static_cast<uint8_t>(color[0]));
- raw.push_back(static_cast<uint8_t>(color[3]));
- break;
- default:
- break;
- }
-
- return raw;
- }
-
- std::vector<uint8_t> color_to_raw(VkFormat format, const VkClearColor &color)
- {
- if (color.useRawValue)
- return color_to_raw(format, color.color.rawColor);
- else
- return color_to_raw(format, color.color.floatColor);
- }
-
void test_clear_color_image(const VkImageCreateInfo &img_info,
- const VkClearColor &clear_color,
+ const VkClearColorValue &clear_color,
const std::vector<VkImageSubresourceRange> &ranges)
{
vk_testing::Image img;
@@ -1322,8 +1283,8 @@
const float color[4],
const std::vector<VkImageSubresourceRange> &ranges)
{
- VkClearColor c = {};
- memcpy(c.color.floatColor, color, sizeof(c.color.floatColor));
+ VkClearColorValue c = {};
+ memcpy(c.f32, color, sizeof(c.f32));
test_clear_color_image(img_info, c, ranges);
}
};
@@ -1361,70 +1322,6 @@
}
}
-class VkCmdClearColorImageRawTest : public VkCmdClearColorImageTest {
-protected:
- VkCmdClearColorImageRawTest() : VkCmdClearColorImageTest(true) {}
-
- void test_clear_color_image_raw(const VkImageCreateInfo &img_info,
- const uint32_t color[4],
- const std::vector<VkImageSubresourceRange> &ranges)
- {
- VkClearColor c = {};
- c.useRawValue = true;
- memcpy(c.color.rawColor, color, sizeof(c.color.rawColor));
- test_clear_color_image(img_info, c, ranges);
- }
-};
-
-TEST_F(VkCmdClearColorImageRawTest, Basic)
-{
- for (std::vector<vk_testing::Device::Format>::const_iterator it = test_formats_.begin();
- it != test_formats_.end(); it++) {
- const uint32_t color[4] = { 0x11111111, 0x22222222, 0x33333333, 0x44444444 };
- VkFormatProperties props;
- VkResult err;
-
- err = vkGetPhysicalDeviceFormatInfo(dev_.gpu().obj(), it->format, &props);
- ASSERT_EQ(err, VK_SUCCESS);
-
- if (it->tiling == VK_IMAGE_TILING_LINEAR && !(props.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
- continue;
-
- if (it->tiling == VK_IMAGE_TILING_OPTIMAL && !(props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))
- continue;
-
- // not sure what to do here
- if (it->format == VK_FORMAT_UNDEFINED ||
- (it->format >= VK_FORMAT_R8G8B8_UNORM &&
- it->format <= VK_FORMAT_R8G8B8_SRGB) ||
- (it->format >= VK_FORMAT_B8G8R8_UNORM &&
- it->format <= VK_FORMAT_B8G8R8_SRGB) ||
- (it->format >= VK_FORMAT_R16G16B16_UNORM &&
- it->format <= VK_FORMAT_R16G16B16_SFLOAT) ||
- (it->format >= VK_FORMAT_R32G32B32_UINT &&
- it->format <= VK_FORMAT_R32G32B32_SFLOAT) ||
- it->format == VK_FORMAT_R64G64B64_SFLOAT ||
- it->format == VK_FORMAT_R64G64B64A64_SFLOAT ||
- (it->format >= VK_FORMAT_D16_UNORM &&
- it->format <= VK_FORMAT_D32_SFLOAT_S8_UINT))
- continue;
-
- VkImageCreateInfo img_info = vk_testing::Image::create_info();
- img_info.imageType = VK_IMAGE_TYPE_2D;
- img_info.format = it->format;
- img_info.extent.width = 64;
- img_info.extent.height = 64;
- img_info.tiling = it->tiling;
- img_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
-
- const VkImageSubresourceRange range =
- vk_testing::Image::subresource_range(img_info, VK_IMAGE_ASPECT_COLOR);
- std::vector<VkImageSubresourceRange> ranges(&range, &range + 1);
-
- test_clear_color_image_raw(img_info, color, ranges);
- }
-}
-
class VkCmdClearDepthStencilTest : public VkCmdBlitImageTest {
protected:
virtual void SetUp()
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 70d53eb..197e4a4 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -4151,11 +4151,10 @@
/* clear via load op to full green */
m_clear_via_load_op = true;
- m_clear_color.useRawValue = false;
- m_clear_color.color.floatColor[0] = 0;
- m_clear_color.color.floatColor[1] = 1;
- m_clear_color.color.floatColor[2] = 0;
- m_clear_color.color.floatColor[3] = 0;
+ m_clear_color.f32[0] = 0;
+ m_clear_color.f32[1] = 1;
+ m_clear_color.f32[2] = 0;
+ m_clear_color.f32[3] = 0;
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
VkCommandBufferObj cmdBuffer(m_device);
@@ -4175,11 +4174,10 @@
/* clear via load op to full red */
m_clear_via_load_op = true;
- m_clear_color.useRawValue = false;
- m_clear_color.color.floatColor[0] = 1;
- m_clear_color.color.floatColor[1] = 0;
- m_clear_color.color.floatColor[2] = 0;
- m_clear_color.color.floatColor[3] = 0;
+ m_clear_color.f32[0] = 1;
+ m_clear_color.f32[1] = 0;
+ m_clear_color.f32[2] = 0;
+ m_clear_color.f32[3] = 0;
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
VkCommandBufferObj cmdBuffer(m_device);
@@ -4193,12 +4191,11 @@
/* Now, partway through this renderpass we want to clear the color
* attachment again, this time to green.
*/
- VkClearColor clear_color;
- clear_color.useRawValue = false;
- clear_color.color.floatColor[0] = 0;
- clear_color.color.floatColor[1] = 1;
- clear_color.color.floatColor[2] = 0;
- clear_color.color.floatColor[3] = 0;
+ VkClearColorValue clear_color;
+ clear_color.f32[0] = 0;
+ clear_color.f32[1] = 1;
+ clear_color.f32[2] = 0;
+ clear_color.f32[3] = 0;
VkRect3D clear_rect = { { 0, 0, 0 }, { (int)m_width, (int)m_height, 1 } };
vkCmdClearColorAttachment(cmdBuffer.obj(), 0,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 756a619..a38ad84 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -52,11 +52,10 @@
{
// clear the back buffer to dark grey
- m_clear_color.color.rawColor[0] = 64;
- m_clear_color.color.rawColor[1] = 64;
- m_clear_color.color.rawColor[2] = 64;
- m_clear_color.color.rawColor[3] = 0;
- m_clear_color.useRawValue = true;
+ m_clear_color.f32[0] = 0.25f;
+ m_clear_color.f32[1] = 0.25f;
+ m_clear_color.f32[2] = 0.25f;
+ m_clear_color.f32[3] = 0.0f;
}
VkRenderFramework::~VkRenderFramework()
@@ -294,7 +293,7 @@
{
std::vector<VkAttachmentLoadOp> load_ops;
std::vector<VkAttachmentStoreOp> store_ops;
- std::vector<VkClearColor> clear_colors;
+ std::vector<VkClearColorValue> clear_colors;
uint32_t i;
@@ -1273,7 +1272,7 @@
vkCmdPipelineBarrier(obj(), src_stages, dest_stages, byRegion, memBarrierCount, ppMemBarriers);
}
-void VkCommandBufferObj::ClearAllBuffers(VkClearColor clear_color, float depth_clear_color, uint32_t stencil_clear_color,
+void VkCommandBufferObj::ClearAllBuffers(VkClearColorValue clear_color, float depth_clear_color, uint32_t stencil_clear_color,
VkDepthStencilObj *depthStencilObj)
{
uint32_t i;
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index 715648f..c1d52fa 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -122,7 +122,7 @@
VkFormat m_render_target_fmt;
VkFormat m_depth_stencil_fmt;
VkColorAttachmentBindInfo m_colorBindings[8];
- VkClearColor m_clear_color;
+ VkClearColorValue m_clear_color;
bool m_clear_via_load_op;
float m_depth_clear_color;
uint32_t m_stencil_clear_color;
@@ -171,7 +171,7 @@
void PipelineBarrier(VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages, bool32_t byRegion, uint32_t memBarrierCount, const void** ppMemBarriers);
void AddRenderTarget(VkImageObj *renderTarget);
void AddDepthStencil();
- void ClearAllBuffers(VkClearColor clear_color, float depth_clear_color, uint32_t stencil_clear_color, VkDepthStencilObj *depthStencilObj);
+ void ClearAllBuffers(VkClearColorValue clear_color, float depth_clear_color, uint32_t stencil_clear_color, VkDepthStencilObj *depthStencilObj);
void PrepareAttachments();
void AddMemoryRefs(vk_testing::Object &vkObject);
void AddMemoryRefs(uint32_t ref_count, const VkDeviceMemory *mem);
diff --git a/vulkan.py b/vulkan.py
index c8e9b8f..ffba32c 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -734,7 +734,7 @@
[Param("VkCmdBuffer", "cmdBuffer"),
Param("VkImage", "image"),
Param("VkImageLayout", "imageLayout"),
- Param("const VkClearColor*", "pColor"),
+ Param("const VkClearColorValue*", "pColor"),
Param("uint32_t", "rangeCount"),
Param("const VkImageSubresourceRange*", "pRanges")]),
@@ -751,7 +751,7 @@
[Param("VkCmdBuffer", "cmdBuffer"),
Param("uint32_t", "colorAttachment"),
Param("VkImageLayout", "imageLayout"),
- Param("const VkClearColor*", "pColor"),
+ Param("const VkClearColorValue*", "pColor"),
Param("uint32_t", "rectCount"),
Param("const VkRect3D*", "pRects")]),