On Thu, 2017-01-05 at 14:08 +0100, Iago Toral Quiroga wrote: > This is the same we do in the GL driver: the hardware provides > gl_Layer > in the VUE header, so when the fragment shader reads it we can't skip > it.
Forgot to add that this fixes the following Vulkan CTS tests: dEQP-VK.geometry.layered.1d_array.fragment_layer dEQP-VK.geometry.layered.2d_array.fragment_layer dEQP-VK.geometry.layered.cube.fragment_layer > --- > > With this patch we now successfully read gl_Layer in fragment > shaders. Layered > rendering still does not work though, probably because we still need > to hook up > the layer_id stuff that Jason added some time ago. I'll look into > that next. And by this I mean that the dEQP-VK.geometry.layered.cube_array.* tests still fail. > src/intel/vulkan/genX_pipeline.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/src/intel/vulkan/genX_pipeline.c > b/src/intel/vulkan/genX_pipeline.c > index 845d020..c1d8ae6 100644 > --- a/src/intel/vulkan/genX_pipeline.c > +++ b/src/intel/vulkan/genX_pipeline.c > @@ -291,6 +291,8 @@ emit_3dstate_sbe(struct anv_pipeline *pipeline) > # define swiz sbe > #endif > > + /* Skip the VUE header and position slots by default */ > + unsigned urb_entry_read_offset = 1; > int max_source_attr = 0; > for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) { > int input_index = wm_prog_data->urb_setup[attr]; > @@ -298,6 +300,12 @@ emit_3dstate_sbe(struct anv_pipeline *pipeline) > if (input_index < 0) > continue; > > + /* gl_Layer is stored in the VUE header */ > + if (attr == VARYING_SLOT_LAYER) { > + urb_entry_read_offset = 0; > + continue; > + } > + > if (attr == VARYING_SLOT_PNTC) { > sbe.PointSpriteTextureCoordinateEnable = 1 << input_index; > continue; > @@ -322,18 +330,22 @@ emit_3dstate_sbe(struct anv_pipeline *pipeline) > swiz.Attribute[input_index].ComponentOverrideZ = true; > swiz.Attribute[input_index].ComponentOverrideW = true; > } else { > - assert(slot >= 2); > - const int source_attr = slot - 2; > - max_source_attr = MAX2(max_source_attr, source_attr); > /* We have to subtract two slots to accout for the URB > entry output > * read offset in the VS and GS stages. > */ > + assert(slot >= 2); > + const int source_attr = slot - 2 * urb_entry_read_offset; > + max_source_attr = MAX2(max_source_attr, source_attr); > swiz.Attribute[input_index].SourceAttribute = source_attr; > } > } > > - sbe.VertexURBEntryReadOffset = 1; /* Skip the VUE header and > position slots */ > + sbe.VertexURBEntryReadOffset = urb_entry_read_offset; > sbe.VertexURBEntryReadLength = DIV_ROUND_UP(max_source_attr + 1, > 2); > +#if GEN_GEN >= 8 > + sbe.ForceVertexURBEntryReadOffset = true; > + sbe.ForceVertexURBEntryReadLength = true; > +#endif > > uint32_t *dw = anv_batch_emit_dwords(&pipeline->batch, > GENX(3DSTATE_SBE_length)); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev