nir: Pass through fb_fetch_output and OutputsRead from GLSL IR.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 20 Jul 2016 03:33:46 +0000 (20:33 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 26 Aug 2016 01:33:29 +0000 (18:33 -0700)
The NIR representation of framebuffer fetch is the same as the GLSL
IR's until interface variables are lowered away, at which point it
will be translated to load output intrinsics.  The GLSL-to-NIR pass
just needs to copy the bits over to the NIR program.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/glsl_to_nir.cpp
src/compiler/nir/nir.h

index d3cc5b44d64bcf885a3b32d9778c2d38193b329f..3ac219665636d5138eca77867ecee9500e7308d8 100644 (file)
@@ -154,6 +154,7 @@ glsl_to_nir(const struct gl_shader_program *shader_prog,
    shader->info.inputs_read = sh->Program->InputsRead;
    shader->info.double_inputs_read = sh->Program->DoubleInputsRead;
    shader->info.outputs_written = sh->Program->OutputsWritten;
+   shader->info.outputs_read = sh->Program->OutputsRead;
    shader->info.patch_inputs_read = sh->Program->PatchInputsRead;
    shader->info.patch_outputs_written = sh->Program->PatchOutputsWritten;
    shader->info.system_values_read = sh->Program->SystemValuesRead;
@@ -406,6 +407,7 @@ nir_visitor::visit(ir_variable *ir)
    var->data.image.restrict_flag = ir->data.image_restrict;
    var->data.image.format = ir->data.image_format;
    var->data.max_array_access = ir->data.max_array_access;
+   var->data.fb_fetch_output = ir->data.fb_fetch_output;
 
    var->num_state_slots = ir->get_num_state_slots();
    if (var->num_state_slots > 0) {
index 5e527d8add123f09d523f8afa48f8bf0e01508c4..1407b2d9f0ef2990923ed1957702142ad8005768 100644 (file)
@@ -226,6 +226,13 @@ typedef struct nir_variable {
        */
       unsigned location_frac:2;
 
+      /**
+       * Whether this is a fragment shader output implicitly initialized with
+       * the previous contents of the specified render target at the
+       * framebuffer location corresponding to this shader invocation.
+       */
+      unsigned fb_fetch_output:1;
+
       /**
        * \brief Layout qualifier for gl_FragDepth.
        *
@@ -1776,6 +1783,8 @@ typedef struct nir_shader_info {
    uint64_t double_inputs_read;
    /* Which outputs are actually written */
    uint64_t outputs_written;
+   /* Which outputs are actually read */
+   uint64_t outputs_read;
    /* Which system values are actually read */
    uint64_t system_values_read;