anv: Add proper support for depth clamping
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Cc: "12.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -380,7 +380,7 @@ void anv_GetPhysicalDeviceFeatures(
|
||||
.logicOp = true,
|
||||
.multiDrawIndirect = false,
|
||||
.drawIndirectFirstInstance = false,
|
||||
.depthClamp = false,
|
||||
.depthClamp = true,
|
||||
.depthBiasClamp = false,
|
||||
.fillModeNonSolid = true,
|
||||
.depthBounds = false,
|
||||
|
@@ -173,6 +173,7 @@ create_pipeline(struct anv_device *device,
|
||||
.cullMode = VK_CULL_MODE_NONE,
|
||||
.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE,
|
||||
.depthBiasEnable = false,
|
||||
.depthClampEnable = true,
|
||||
},
|
||||
.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
|
||||
|
@@ -1165,6 +1165,8 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
|
||||
pipeline->batch.relocs = &pipeline->batch_relocs;
|
||||
|
||||
copy_non_dynamic_state(pipeline, pCreateInfo);
|
||||
pipeline->depth_clamp_enable = pCreateInfo->pRasterizationState &&
|
||||
pCreateInfo->pRasterizationState->depthClampEnable;
|
||||
|
||||
pipeline->use_repclear = extra && extra->use_repclear;
|
||||
|
||||
|
@@ -1360,7 +1360,8 @@ VkResult
|
||||
anv_cmd_buffer_new_binding_table_block(struct anv_cmd_buffer *cmd_buffer);
|
||||
|
||||
void gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer);
|
||||
void gen8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer);
|
||||
void gen8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer,
|
||||
bool depth_clamp_enable);
|
||||
void gen7_cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer);
|
||||
|
||||
void anv_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer);
|
||||
@@ -1485,6 +1486,8 @@ struct anv_pipeline {
|
||||
|
||||
uint32_t cs_right_mask;
|
||||
|
||||
bool depth_clamp_enable;
|
||||
|
||||
struct {
|
||||
uint32_t sf[7];
|
||||
uint32_t depth_stencil_state[3];
|
||||
|
@@ -196,6 +196,7 @@ genX(graphics_pipeline_create)(
|
||||
clip.ClipEnable = !(extra && extra->use_rectlist),
|
||||
clip.APIMode = APIMODE_OGL,
|
||||
clip.ViewportXYClipTestEnable = true,
|
||||
clip.ViewportZClipTestEnable = !pipeline->depth_clamp_enable,
|
||||
clip.ClipMode = CLIPMODE_NORMAL,
|
||||
|
||||
clip.TriangleStripListProvokingVertexSelect = 0,
|
||||
|
@@ -77,7 +77,8 @@ gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer)
|
||||
}
|
||||
|
||||
void
|
||||
gen8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer)
|
||||
gen8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer,
|
||||
bool depth_clamp_enable)
|
||||
{
|
||||
uint32_t count = cmd_buffer->state.dynamic.viewport.count;
|
||||
const VkViewport *viewports = cmd_buffer->state.dynamic.viewport.viewports;
|
||||
@@ -88,8 +89,8 @@ gen8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer)
|
||||
const VkViewport *vp = &viewports[i];
|
||||
|
||||
struct GENX(CC_VIEWPORT) cc_viewport = {
|
||||
.MinimumDepth = vp->minDepth,
|
||||
.MaximumDepth = vp->maxDepth,
|
||||
.MinimumDepth = depth_clamp_enable ? vp->minDepth : 0.0f,
|
||||
.MaximumDepth = depth_clamp_enable ? vp->maxDepth : 1.0f,
|
||||
};
|
||||
|
||||
GENX(CC_VIEWPORT_pack)(NULL, cc_state.map + i * 8, &cc_viewport);
|
||||
|
@@ -85,11 +85,11 @@ emit_rs_state(struct anv_pipeline *pipeline,
|
||||
.BackFaceFillMode = vk_to_gen_fillmode[info->polygonMode],
|
||||
.ScissorRectangleEnable = !(extra && extra->use_rectlist),
|
||||
#if GEN_GEN == 8
|
||||
.ViewportZClipTestEnable = true,
|
||||
.ViewportZClipTestEnable = !pipeline->depth_clamp_enable,
|
||||
#else
|
||||
/* GEN9+ splits ViewportZClipTestEnable into near and far enable bits */
|
||||
.ViewportZFarClipTestEnable = true,
|
||||
.ViewportZNearClipTestEnable = true,
|
||||
.ViewportZFarClipTestEnable = !pipeline->depth_clamp_enable,
|
||||
.ViewportZNearClipTestEnable = !pipeline->depth_clamp_enable,
|
||||
#endif
|
||||
.GlobalDepthOffsetEnableSolid = info->depthBiasEnable,
|
||||
.GlobalDepthOffsetEnableWireframe = info->depthBiasEnable,
|
||||
|
@@ -525,9 +525,13 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
||||
if (dirty)
|
||||
gen7_cmd_buffer_emit_descriptor_pointers(cmd_buffer, dirty);
|
||||
|
||||
if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT) {
|
||||
if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT)
|
||||
gen8_cmd_buffer_emit_viewport(cmd_buffer);
|
||||
gen8_cmd_buffer_emit_depth_viewport(cmd_buffer);
|
||||
|
||||
if (cmd_buffer->state.dirty & (ANV_CMD_DIRTY_DYNAMIC_VIEWPORT |
|
||||
ANV_CMD_DIRTY_PIPELINE)) {
|
||||
gen8_cmd_buffer_emit_depth_viewport(cmd_buffer,
|
||||
pipeline->depth_clamp_enable);
|
||||
}
|
||||
|
||||
if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_SCISSOR)
|
||||
|
Reference in New Issue
Block a user