summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrChat <arkolbed@gmail.com>2018-02-18 15:14:34 -0600
committerDrChat <arkolbed@gmail.com>2018-02-18 15:14:34 -0600
commit05192e3c0fa54d352865f57d6b7456098cb9822a (patch)
tree374cc10ac163e74cc4a1b668665cae909eba213e
parent1a113fb82b3532c3167fc113faf1ac0a18e362ca (diff)
[Vulkan] Prevent negative scissor offsets
-rw-r--r--src/xenia/gpu/vulkan/pipeline_cache.cc15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/xenia/gpu/vulkan/pipeline_cache.cc b/src/xenia/gpu/vulkan/pipeline_cache.cc
index 1214fe0e0..6aace62fe 100644
--- a/src/xenia/gpu/vulkan/pipeline_cache.cc
+++ b/src/xenia/gpu/vulkan/pipeline_cache.cc
@@ -534,16 +534,19 @@ bool PipelineCache::SetDynamicState(VkCommandBuffer command_buffer,
if (scissor_state_dirty) {
int32_t ws_x = regs.pa_sc_window_scissor_tl & 0x7FFF;
int32_t ws_y = (regs.pa_sc_window_scissor_tl >> 16) & 0x7FFF;
- uint32_t ws_w = (regs.pa_sc_window_scissor_br & 0x7FFF) - ws_x;
- uint32_t ws_h = ((regs.pa_sc_window_scissor_br >> 16) & 0x7FFF) - ws_y;
+ int32_t ws_w = (regs.pa_sc_window_scissor_br & 0x7FFF) - ws_x;
+ int32_t ws_h = ((regs.pa_sc_window_scissor_br >> 16) & 0x7FFF) - ws_y;
ws_x += window_offset_x;
ws_y += window_offset_y;
+ int32_t adj_x = ws_x - std::max(ws_x, 0);
+ int32_t adj_y = ws_y - std::max(ws_y, 0);
+
VkRect2D scissor_rect;
- scissor_rect.offset.x = ws_x;
- scissor_rect.offset.y = ws_y;
- scissor_rect.extent.width = ws_w;
- scissor_rect.extent.height = ws_h;
+ scissor_rect.offset.x = ws_x - adj_x;
+ scissor_rect.offset.y = ws_y - adj_y;
+ scissor_rect.extent.width = std::max(ws_w + adj_x, 0);
+ scissor_rect.extent.height = std::max(ws_h + adj_y, 0);
vkCmdSetScissor(command_buffer, 0, 1, &scissor_rect);
}