anv/pipeline: Silently pass tests if depth or stencil is missing
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Cc: "12.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
bc7f7e1953
commit
56a178922f
|
@ -155,6 +155,8 @@ genX(graphics_pipeline_create)(
|
||||||
VkPipeline* pPipeline)
|
VkPipeline* pPipeline)
|
||||||
{
|
{
|
||||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||||
|
ANV_FROM_HANDLE(anv_render_pass, pass, pCreateInfo->renderPass);
|
||||||
|
struct anv_subpass *subpass = &pass->subpasses[pCreateInfo->subpass];
|
||||||
struct anv_pipeline *pipeline;
|
struct anv_pipeline *pipeline;
|
||||||
VkResult result;
|
VkResult result;
|
||||||
|
|
||||||
|
@ -178,7 +180,7 @@ genX(graphics_pipeline_create)(
|
||||||
assert(pCreateInfo->pRasterizationState);
|
assert(pCreateInfo->pRasterizationState);
|
||||||
gen7_emit_rs_state(pipeline, pCreateInfo->pRasterizationState, extra);
|
gen7_emit_rs_state(pipeline, pCreateInfo->pRasterizationState, extra);
|
||||||
|
|
||||||
emit_ds_state(pipeline, pCreateInfo->pDepthStencilState);
|
emit_ds_state(pipeline, pCreateInfo->pDepthStencilState, pass, subpass);
|
||||||
|
|
||||||
gen7_emit_cb_state(pipeline, pCreateInfo->pColorBlendState,
|
gen7_emit_cb_state(pipeline, pCreateInfo->pColorBlendState,
|
||||||
pCreateInfo->pMultisampleState);
|
pCreateInfo->pMultisampleState);
|
||||||
|
|
|
@ -268,6 +268,8 @@ genX(graphics_pipeline_create)(
|
||||||
VkPipeline* pPipeline)
|
VkPipeline* pPipeline)
|
||||||
{
|
{
|
||||||
ANV_FROM_HANDLE(anv_device, device, _device);
|
ANV_FROM_HANDLE(anv_device, device, _device);
|
||||||
|
ANV_FROM_HANDLE(anv_render_pass, pass, pCreateInfo->renderPass);
|
||||||
|
struct anv_subpass *subpass = &pass->subpasses[pCreateInfo->subpass];
|
||||||
struct anv_pipeline *pipeline;
|
struct anv_pipeline *pipeline;
|
||||||
VkResult result;
|
VkResult result;
|
||||||
uint32_t offset, length;
|
uint32_t offset, length;
|
||||||
|
@ -294,7 +296,7 @@ genX(graphics_pipeline_create)(
|
||||||
emit_rs_state(pipeline, pCreateInfo->pRasterizationState,
|
emit_rs_state(pipeline, pCreateInfo->pRasterizationState,
|
||||||
pCreateInfo->pMultisampleState, extra);
|
pCreateInfo->pMultisampleState, extra);
|
||||||
emit_ms_state(pipeline, pCreateInfo->pMultisampleState);
|
emit_ms_state(pipeline, pCreateInfo->pMultisampleState);
|
||||||
emit_ds_state(pipeline, pCreateInfo->pDepthStencilState);
|
emit_ds_state(pipeline, pCreateInfo->pDepthStencilState, pass, subpass);
|
||||||
emit_cb_state(pipeline, pCreateInfo->pColorBlendState,
|
emit_cb_state(pipeline, pCreateInfo->pColorBlendState,
|
||||||
pCreateInfo->pMultisampleState);
|
pCreateInfo->pMultisampleState);
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
* IN THE SOFTWARE.
|
* IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "vk_format_info.h"
|
||||||
|
|
||||||
static uint32_t
|
static uint32_t
|
||||||
vertex_element_comp_control(enum isl_format format, unsigned comp)
|
vertex_element_comp_control(enum isl_format format, unsigned comp)
|
||||||
{
|
{
|
||||||
|
@ -428,7 +430,9 @@ static const uint32_t vk_to_gen_stencil_op[] = {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_ds_state(struct anv_pipeline *pipeline,
|
emit_ds_state(struct anv_pipeline *pipeline,
|
||||||
const VkPipelineDepthStencilStateCreateInfo *info)
|
const VkPipelineDepthStencilStateCreateInfo *info,
|
||||||
|
const struct anv_render_pass *pass,
|
||||||
|
const struct anv_subpass *subpass)
|
||||||
{
|
{
|
||||||
#if GEN_GEN == 7
|
#if GEN_GEN == 7
|
||||||
# define depth_stencil_dw pipeline->gen7.depth_stencil_state
|
# define depth_stencil_dw pipeline->gen7.depth_stencil_state
|
||||||
|
@ -470,6 +474,30 @@ emit_ds_state(struct anv_pipeline *pipeline,
|
||||||
.BackfaceStencilTestFunction = vk_to_gen_compare_op[info->back.compareOp],
|
.BackfaceStencilTestFunction = vk_to_gen_compare_op[info->back.compareOp],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
VkImageAspectFlags aspects = 0;
|
||||||
|
if (pass->attachments == NULL) {
|
||||||
|
/* This comes from meta. Assume we have verything. */
|
||||||
|
aspects = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
|
} else if (subpass->depth_stencil_attachment != VK_ATTACHMENT_UNUSED) {
|
||||||
|
VkFormat depth_stencil_format =
|
||||||
|
pass->attachments[subpass->depth_stencil_attachment].format;
|
||||||
|
aspects = vk_format_aspects(depth_stencil_format);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The Vulkan spec requires that if either depth or stencil is not present,
|
||||||
|
* the pipeline is to act as if the test silently passes.
|
||||||
|
*/
|
||||||
|
if (!(aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) {
|
||||||
|
depth_stencil.DepthBufferWriteEnable = false;
|
||||||
|
depth_stencil.DepthTestFunction = PREFILTEROPALWAYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(aspects & VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
||||||
|
depth_stencil.StencilBufferWriteEnable = false;
|
||||||
|
depth_stencil.StencilTestFunction = PREFILTEROPALWAYS;
|
||||||
|
depth_stencil.BackfaceStencilTestFunction = PREFILTEROPALWAYS;
|
||||||
|
}
|
||||||
|
|
||||||
/* From the Broadwell PRM:
|
/* From the Broadwell PRM:
|
||||||
*
|
*
|
||||||
* "If Depth_Test_Enable = 1 AND Depth_Test_func = EQUAL, the
|
* "If Depth_Test_Enable = 1 AND Depth_Test_func = EQUAL, the
|
||||||
|
|
Loading…
Reference in New Issue