// Copyright (c) 2019-2020 Qualcomm Technologies, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_QCOM_render_pass_shader_resolve.txt[]

=== Other Extension Metadata

*Last Modified Date*::
    2019-11-07
*IP Status*::
    No known IP claims.
*Interactions and External Dependencies*::
    None.
*Contributors*::
  - Srihari Babu Alla, Qualcomm
  - Bill Licea-Kane, Qualcomm
  - Jeff Leger, Qualcomm

=== Description

This extension allows a shader resolve to replace fixed-function resolve.

Fixed-function resolve is limited in function to simple filters of
multisample buffers to a single sample buffer.

Fixed-function resolve is more performance efficient and/or power efficient
than shader resolve for such simple filters.

Shader resolve allows a shader writer to create complex, non-linear
filtering of a multisample buffer in the last subpass of a subpass
dependency chain.

This extension also provides a bit which can: be used to enlarge a sample
region dependency to a fragment region dependency, so that a
framebuffer-region dependency can: replace a framebuffer-global dependency
in some cases.

include::{generated}/interfaces/VK_QCOM_render_pass_shader_resolve.txt[]

=== Issues

1) Should this extension be named render_pass_shader_resolve?

*RESOLVED* Yes.

This is part of suite of small extensions to render pass.

Following the style guide, instead of following VK_KHR_create_renderpass2.

2) Should the VK_SAMPLE_COUNT_1_BIT be required for each pColorAttachment
and the DepthStencilAttachent?

*RESOLVED* No.

While this may not be a common use case, and while most fixed-function
resolve hardware has this limitation, there is little reason to require a
shader resolve to resolve to a single sample buffer.

3) Should a shader resolve subpass be the last subpass in a render pass?

*RESOLVED* Yes.

To be more specific, it should be the last subpass in a subpass dependency
chain.

4) Do we need the ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM bit?

*RESOLVED* Yes.

This applies when an input attachment's sample count is equal to
pname:rasterizationSamples.
Further, if pname:sampleShading is enabled (explicitly or implicitly) then
pname:minSampleShading must: equal 0.0.

However, this bit may be set on any subpass, it is not restricted to a
shader resolve subpass.

=== Version History

  * Revision 1, 2019-06-28 (wwlk)
    - Initial draft
  * Revision 2, 2019-11-06 (wwlk)
    - General clean-up/spec updates
    - Added issues
  * Revision 3, 2019-11-07 (wwlk)
    - Typos
    - Additional issues
    - Clarified that a shader resolve subpass is the last subpass in a
      subpass dependency chain
  * Revision 4, 2020-01-06 (wwlk)
    - Change resolution of Issue 1 (_render_pass_, not _renderpass_)
