diff options
author | Jason Ekstrand <[email protected]> | 2019-06-19 16:04:54 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-06-21 14:18:59 +0000 |
commit | 4a757d6c31563fd92d7cfb4ab2e8e7b3ad62014c (patch) | |
tree | e5ecdfb0cb6f0fde627c27d1de37777f11fa9ca3 /src | |
parent | 13f0c278c528167b14badf8172827412526d2160 (diff) |
anv: Enable the guardband clip test
In workloads where there is a lot of geometry drawn that crosses over
the edge of the viewport, this should substantially improve clipper
performance. Not really sure why it's taken 3 years to turn it on but
we never got around to it.
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/intel/vulkan/gen8_cmd_buffer.c | 23 | ||||
-rw-r--r-- | src/intel/vulkan/genX_pipeline.c | 1 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/intel/vulkan/gen8_cmd_buffer.c b/src/intel/vulkan/gen8_cmd_buffer.c index 2e6d9de9f4a..91d47ccf5bd 100644 --- a/src/intel/vulkan/gen8_cmd_buffer.c +++ b/src/intel/vulkan/gen8_cmd_buffer.c @@ -31,11 +31,13 @@ #include "genxml/gen_macros.h" #include "genxml/genX_pack.h" +#include "common/gen_guardband.h" #if GEN_GEN == 8 void gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer) { + struct anv_framebuffer *fb = cmd_buffer->state.framebuffer; uint32_t count = cmd_buffer->state.gfx.dynamic.viewport.count; const VkViewport *viewports = cmd_buffer->state.gfx.dynamic.viewport.viewports; @@ -47,7 +49,7 @@ gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer) /* The gen7 state struct has just the matrix and guardband fields, the * gen8 struct adds the min/max viewport fields. */ - struct GENX(SF_CLIP_VIEWPORT) sf_clip_viewport = { + struct GENX(SF_CLIP_VIEWPORT) sfv = { .ViewportMatrixElementm00 = vp->width / 2, .ViewportMatrixElementm11 = vp->height / 2, .ViewportMatrixElementm22 = vp->maxDepth - vp->minDepth, @@ -64,8 +66,23 @@ gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer) .YMaxViewPort = MAX2(vp->y, vp->y + vp->height) - 1, }; - GENX(SF_CLIP_VIEWPORT_pack)(NULL, sf_clip_state.map + i * 64, - &sf_clip_viewport); + if (fb) { + /* We can only calculate a "real" guardband clip if we know the + * framebuffer at the time we emit the packet. Otherwise, we have + * fall back to a worst-case guardband of [-1, 1]. + */ + gen_calculate_guardband_size(fb->width, fb->height, + sfv.ViewportMatrixElementm00, + sfv.ViewportMatrixElementm11, + sfv.ViewportMatrixElementm30, + sfv.ViewportMatrixElementm31, + &sfv.XMinClipGuardband, + &sfv.XMaxClipGuardband, + &sfv.YMinClipGuardband, + &sfv.YMaxClipGuardband); + } + + GENX(SF_CLIP_VIEWPORT_pack)(NULL, sf_clip_state.map + i * 64, &sfv); } anv_batch_emit(&cmd_buffer->batch, diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index 6b64f7ea8c7..e35bb5e3405 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -1077,6 +1077,7 @@ emit_3dstate_clip(struct anv_pipeline *pipeline, clip.EarlyCullEnable = true; clip.APIMode = APIMODE_D3D, clip.ViewportXYClipTestEnable = true; + clip.GuardbandClipTestEnable = true; #if GEN_GEN >= 8 clip.VertexSubPixelPrecisionSelect = _8Bit; |