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:
Jason Ekstrand
2016-06-14 08:40:49 -07:00
parent 8a46b505cb
commit eb6764c4a7
8 changed files with 22 additions and 10 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;

View File

@@ -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];

View File

@@ -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,

View File

@@ -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);

View File

@@ -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,

View File

@@ -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)