From d2543658ef6fe0ad59af217a09a931d3b6174a43 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Tue, 5 Oct 2021 14:49:40 +0300 Subject: [PATCH] turnip: clamp per-tile scissors to max viewport size in binning pass Tiles on the edge may cross maximum viewport size, we have to clamp per-tile scissor to maximum allowed viewport dimensions. Add MAX_VIEWPORT_SIZE constant along the way. Fixes vkd3d test "test_draw_uav_only" Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.c | 4 ++-- src/freedreno/vulkan/tu_device.c | 2 +- src/freedreno/vulkan/tu_private.h | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index f2bb632bc5a..285e3c173a5 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -609,8 +609,8 @@ tu6_emit_tile_select(struct tu_cmd_buffer *cmd, const uint32_t x1 = fb->tile0.width * tx; const uint32_t y1 = fb->tile0.height * ty; - const uint32_t x2 = x1 + fb->tile0.width - 1; - const uint32_t y2 = y1 + fb->tile0.height - 1; + const uint32_t x2 = MIN2(x1 + fb->tile0.width - 1, MAX_VIEWPORT_SIZE - 1); + const uint32_t y2 = MIN2(y1 + fb->tile0.height - 1, MAX_VIEWPORT_SIZE - 1); tu6_emit_window_scissor(cs, x1, y1, x2, y2); tu6_emit_window_offset(cs, x1, y1); diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 855409db3ee..181772fcc48 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -922,7 +922,7 @@ tu_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, .maxSamplerLodBias = 4095.0 / 256.0, /* [-16, 15.99609375] */ .maxSamplerAnisotropy = 16, .maxViewports = MAX_VIEWPORTS, - .maxViewportDimensions = { (1 << 14), (1 << 14) }, + .maxViewportDimensions = { MAX_VIEWPORT_SIZE, MAX_VIEWPORT_SIZE }, .viewportBoundsRange = { INT16_MIN, INT16_MAX }, .viewportSubPixelBits = 8, .minMemoryMapAlignment = 4096, /* A page */ diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index 44694ff5850..788f9bf737b 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -100,6 +100,7 @@ typedef uint32_t xcb_window_t; #define MAX_RTS 8 #define MAX_VSC_PIPES 32 #define MAX_VIEWPORTS 16 +#define MAX_VIEWPORT_SIZE (1 << 14) #define MAX_SCISSORS 16 #define MAX_DISCARD_RECTANGLES 4 #define MAX_PUSH_CONSTANTS_SIZE 128