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,
|
.logicOp = true,
|
||||||
.multiDrawIndirect = false,
|
.multiDrawIndirect = false,
|
||||||
.drawIndirectFirstInstance = false,
|
.drawIndirectFirstInstance = false,
|
||||||
.depthClamp = false,
|
.depthClamp = true,
|
||||||
.depthBiasClamp = false,
|
.depthBiasClamp = false,
|
||||||
.fillModeNonSolid = true,
|
.fillModeNonSolid = true,
|
||||||
.depthBounds = false,
|
.depthBounds = false,
|
||||||
|
@@ -173,6 +173,7 @@ create_pipeline(struct anv_device *device,
|
|||||||
.cullMode = VK_CULL_MODE_NONE,
|
.cullMode = VK_CULL_MODE_NONE,
|
||||||
.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE,
|
.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE,
|
||||||
.depthBiasEnable = false,
|
.depthBiasEnable = false,
|
||||||
|
.depthClampEnable = true,
|
||||||
},
|
},
|
||||||
.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
|
.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
|
||||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
|
.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;
|
pipeline->batch.relocs = &pipeline->batch_relocs;
|
||||||
|
|
||||||
copy_non_dynamic_state(pipeline, pCreateInfo);
|
copy_non_dynamic_state(pipeline, pCreateInfo);
|
||||||
|
pipeline->depth_clamp_enable = pCreateInfo->pRasterizationState &&
|
||||||
|
pCreateInfo->pRasterizationState->depthClampEnable;
|
||||||
|
|
||||||
pipeline->use_repclear = extra && extra->use_repclear;
|
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);
|
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_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 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);
|
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;
|
uint32_t cs_right_mask;
|
||||||
|
|
||||||
|
bool depth_clamp_enable;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t sf[7];
|
uint32_t sf[7];
|
||||||
uint32_t depth_stencil_state[3];
|
uint32_t depth_stencil_state[3];
|
||||||
|
@@ -196,6 +196,7 @@ genX(graphics_pipeline_create)(
|
|||||||
clip.ClipEnable = !(extra && extra->use_rectlist),
|
clip.ClipEnable = !(extra && extra->use_rectlist),
|
||||||
clip.APIMode = APIMODE_OGL,
|
clip.APIMode = APIMODE_OGL,
|
||||||
clip.ViewportXYClipTestEnable = true,
|
clip.ViewportXYClipTestEnable = true,
|
||||||
|
clip.ViewportZClipTestEnable = !pipeline->depth_clamp_enable,
|
||||||
clip.ClipMode = CLIPMODE_NORMAL,
|
clip.ClipMode = CLIPMODE_NORMAL,
|
||||||
|
|
||||||
clip.TriangleStripListProvokingVertexSelect = 0,
|
clip.TriangleStripListProvokingVertexSelect = 0,
|
||||||
|
@@ -77,7 +77,8 @@ gen8_cmd_buffer_emit_viewport(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
uint32_t count = cmd_buffer->state.dynamic.viewport.count;
|
||||||
const VkViewport *viewports = cmd_buffer->state.dynamic.viewport.viewports;
|
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];
|
const VkViewport *vp = &viewports[i];
|
||||||
|
|
||||||
struct GENX(CC_VIEWPORT) cc_viewport = {
|
struct GENX(CC_VIEWPORT) cc_viewport = {
|
||||||
.MinimumDepth = vp->minDepth,
|
.MinimumDepth = depth_clamp_enable ? vp->minDepth : 0.0f,
|
||||||
.MaximumDepth = vp->maxDepth,
|
.MaximumDepth = depth_clamp_enable ? vp->maxDepth : 1.0f,
|
||||||
};
|
};
|
||||||
|
|
||||||
GENX(CC_VIEWPORT_pack)(NULL, cc_state.map + i * 8, &cc_viewport);
|
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],
|
.BackFaceFillMode = vk_to_gen_fillmode[info->polygonMode],
|
||||||
.ScissorRectangleEnable = !(extra && extra->use_rectlist),
|
.ScissorRectangleEnable = !(extra && extra->use_rectlist),
|
||||||
#if GEN_GEN == 8
|
#if GEN_GEN == 8
|
||||||
.ViewportZClipTestEnable = true,
|
.ViewportZClipTestEnable = !pipeline->depth_clamp_enable,
|
||||||
#else
|
#else
|
||||||
/* GEN9+ splits ViewportZClipTestEnable into near and far enable bits */
|
/* GEN9+ splits ViewportZClipTestEnable into near and far enable bits */
|
||||||
.ViewportZFarClipTestEnable = true,
|
.ViewportZFarClipTestEnable = !pipeline->depth_clamp_enable,
|
||||||
.ViewportZNearClipTestEnable = true,
|
.ViewportZNearClipTestEnable = !pipeline->depth_clamp_enable,
|
||||||
#endif
|
#endif
|
||||||
.GlobalDepthOffsetEnableSolid = info->depthBiasEnable,
|
.GlobalDepthOffsetEnableSolid = info->depthBiasEnable,
|
||||||
.GlobalDepthOffsetEnableWireframe = info->depthBiasEnable,
|
.GlobalDepthOffsetEnableWireframe = info->depthBiasEnable,
|
||||||
|
@@ -525,9 +525,13 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
if (dirty)
|
if (dirty)
|
||||||
gen7_cmd_buffer_emit_descriptor_pointers(cmd_buffer, 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_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)
|
if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_SCISSOR)
|
||||||
|
Reference in New Issue
Block a user