nvc0: Add support for ARB_post_depth_coverage
authorLyude <lyude@redhat.com>
Wed, 24 May 2017 19:42:41 +0000 (15:42 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 3 Jun 2017 03:19:42 +0000 (23:19 -0400)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
docs/relnotes/17.2.0.html
src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h
src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
src/gallium/drivers/nouveau/nvc0/nvc0_3d.xml.h
src/gallium/drivers/nouveau/nvc0/nvc0_program.c
src/gallium/drivers/nouveau/nvc0/nvc0_program.h
src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c

index 426bb72a51e0cdf6d55dd073ed3b8c0a357a4356..135d1e81ddcecd7f4ccce8ada4f7af6735879878 100644 (file)
@@ -44,6 +44,7 @@ Note: some of the new features are only available with certain drivers.
 </p>
 
 <ul>
+<li>GL_ARB_post_depth_coverage on nvc0 (GM200+)</li>
 <li>GL_ARB_shader_viewport_layer_array on nvc0 (GM200+)</li>
 <li>GL_AMD_vertex_shader_layer on nvc0 (GM200+)</li>
 <li>GL_AMD_vertex_shader_viewport_index on nvc0 (GM200+)</li>
index 1962ead35a06ab8307c2d9e0a3f696e936ec3434..76f08b1c3dc03722123dd3d24fa7e06d9ca50745 100644 (file)
@@ -137,6 +137,7 @@ struct nv50_ir_prog_info
          unsigned numColourResults;
          bool writesDepth;
          bool earlyFragTests;
+         bool postDepthCoverage;
          bool separateFragData;
          bool usesDiscard;
          bool persampleInvocation;
index b58300113176c5798e3e7eb19961bde6ae55df14..1264dd4834e2d2ea2f7ff6e6b7bc4033ef584812 100644 (file)
@@ -1277,6 +1277,9 @@ void Source::scanProperty(const struct tgsi_full_property *prop)
    case TGSI_PROPERTY_FS_EARLY_DEPTH_STENCIL:
       info->prop.fp.earlyFragTests = prop->u[0].Data;
       break;
+   case TGSI_PROPERTY_FS_POST_DEPTH_COVERAGE:
+      info->prop.fp.postDepthCoverage = prop->u[0].Data;
+      break;
    case TGSI_PROPERTY_MUL_ZERO_WINS:
       info->io.mul_zero_wins = prop->u[0].Data;
       break;
index accde94f641069c5f3d17fbe9932b90c8c3322bc..d7245fbcae1c50c326f60fa6784d7627a282b13b 100644 (file)
@@ -631,6 +631,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NVC0_3D_UNK0F00__ESIZE                                 0x00000004
 #define NVC0_3D_UNK0F00__LEN                                   0x00000004
 
+#define NVC0_3D_POST_DEPTH_COVERAGE                            0x00000f1c
+
 #define NVE4_3D_UNK0F20(i0)                                   (0x00000f20 + 0x4*(i0))
 #define NVE4_3D_UNK0F20__ESIZE                                 0x00000004
 #define NVE4_3D_UNK0F20__LEN                                   0x00000005
index 27740bc87f27584cfdcc7aa387ebbdb24c150d1a..e43a8de9f5966523764b703c117c1345c05e1334 100644 (file)
@@ -487,6 +487,7 @@ nvc0_fp_gen_header(struct nvc0_program *fp, struct nv50_ir_prog_info *info)
    fp->fp.early_z = info->prop.fp.earlyFragTests;
    fp->fp.sample_mask_in = info->prop.fp.usesSampleMaskIn;
    fp->fp.reads_framebuffer = info->prop.fp.readsFramebuffer;
+   fp->fp.post_depth_coverage = info->prop.fp.postDepthCoverage;
 
    /* Mark position xy and layer as read */
    if (fp->fp.reads_framebuffer)
index 421ca191d0afdb9fe2af08bc8ecf3faa2bc01674..b73822ea9f7f2eadf77290e3814aaf830594193e 100644 (file)
@@ -50,6 +50,7 @@ struct nvc0_program {
       bool force_persample_interp;
       bool flatshade;
       bool reads_framebuffer;
+      bool post_depth_coverage;
    } fp;
    struct {
       uint32_t tess_mode; /* ~0 if defined by the other stage */
index cf376a631a1f6ce3ad9f98fc6182ca95a68df00b..cf31b6c9ba33dd25d681fd5959d05f8c1104aec5 100644 (file)
@@ -267,6 +267,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
    case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
    case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
+   case PIPE_CAP_POST_DEPTH_COVERAGE:
       return class_3d >= GM200_3D_CLASS;
    case PIPE_CAP_TGSI_BALLOT:
       return class_3d >= NVE4_3D_CLASS;
@@ -299,7 +300,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
    case PIPE_CAP_INT64_DIVMOD:
    case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
-   case PIPE_CAP_POST_DEPTH_COVERAGE:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index 9e0211b14b61b1f97272b698fe299375f66c2b0f..de0a02d9cb81aa789992037e6c0ce343b660cf2d 100644 (file)
@@ -55,6 +55,7 @@ struct nvc0_graph_state {
    uint32_t uniform_buffer_bound[6];
    struct nvc0_transform_feedback_state *tfb;
    bool seamless_cube_map;
+   bool post_depth_coverage;
 };
 
 struct nvc0_screen {
index a8c814fb372b15329528d81ce338369005ecb977..697bf491a01523bc9f84638aea95d2a1f95100a2 100644 (file)
@@ -146,6 +146,11 @@ nvc0_fragprog_validate(struct nvc0_context *nvc0)
       nvc0->state.early_z_forced = fp->fp.early_z;
       IMMED_NVC0(push, NVC0_3D(FORCE_EARLY_FRAGMENT_TESTS), fp->fp.early_z);
    }
+   if (fp->fp.post_depth_coverage != nvc0->state.post_depth_coverage) {
+      nvc0->state.post_depth_coverage = fp->fp.post_depth_coverage;
+      IMMED_NVC0(push, NVC0_3D(POST_DEPTH_COVERAGE),
+                 fp->fp.post_depth_coverage);
+   }
 
    BEGIN_NVC0(push, NVC0_3D(SP_SELECT(5)), 2);
    PUSH_DATA (push, 0x51);