summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <[email protected]>2017-05-15 01:23:24 +0200
committerBas Nieuwenhuizen <[email protected]>2017-05-22 20:07:21 +0200
commit0628580eff6110eda71e33ee608c633266bfdeff (patch)
treeb19b0772afc786186afcaf788344cf64661eb3bb
parent62e182acd0b20eeb8ed3628048000b6ea4263f11 (diff)
radv: Specify semantics of HTILE layout helpers.
And correct implementation to specify only what we support. Signed-off-by: Bas Nieuwenhuizen <[email protected]> Reviewed-by: Dave Airlie <[email protected]>
-rw-r--r--src/amd/vulkan/radv_cmd_buffer.c4
-rw-r--r--src/amd/vulkan/radv_image.c9
-rw-r--r--src/amd/vulkan/radv_private.h10
3 files changed, 20 insertions, 3 deletions
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index a9be8974271..e0574f5cbf1 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -1104,6 +1104,10 @@ radv_emit_framebuffer_state(struct radv_cmd_buffer *cmd_buffer)
struct radv_image *image = att->attachment->image;
cmd_buffer->device->ws->cs_add_buffer(cmd_buffer->cs, att->attachment->bo, 8);
+ /* We currently don't support writing decompressed HTILE */
+ assert(radv_layout_has_htile(image, layout) ==
+ radv_layout_is_htile_compressed(image, layout));
+
radv_emit_fb_ds_state(cmd_buffer, &att->ds, image, layout);
if (att->ds.offset_scale != cmd_buffer->state.offset_scale) {
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 0a36be0822d..62f5f01400e 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -773,14 +773,17 @@ radv_image_view_init(struct radv_image_view *iview,
bool radv_layout_has_htile(const struct radv_image *image,
VkImageLayout layout)
{
- return (layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
- layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ return image->surface.htile_size &&
+ (layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
+ layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
}
bool radv_layout_is_htile_compressed(const struct radv_image *image,
VkImageLayout layout)
{
- return layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ return image->surface.htile_size &&
+ (layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
+ layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
}
bool radv_layout_can_fast_clear(const struct radv_image *image,
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 6c4027bbdb8..f9049802939 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1186,10 +1186,20 @@ struct radv_image {
uint32_t clear_value_offset;
};
+/* Whether the image has a htile that is known consistent with the contents of
+ * the image. */
bool radv_layout_has_htile(const struct radv_image *image,
VkImageLayout layout);
+
+/* Whether the image has a htile that is known consistent with the contents of
+ * the image and is allowed to be in compressed form.
+ *
+ * If this is false reads that don't use the htile should be able to return
+ * correct results.
+ */
bool radv_layout_is_htile_compressed(const struct radv_image *image,
VkImageLayout layout);
+
bool radv_layout_can_fast_clear(const struct radv_image *image,
VkImageLayout layout,
unsigned queue_mask);