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 <kenneth@whitecape.org> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
parent
13f0c278c5
commit
4a757d6c31
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue