[Mesa-dev] [PATCH 00/37] Geometry shader support in Sandy Bridge
Iago Toral
itoral at igalia.com
Wed Aug 20 02:16:44 PDT 2014
El 2014-08-16 09:11, Jordan Justen escribió:
> On Thu, Aug 14, 2014 at 4:11 AM, Iago Toral Quiroga <itoral at igalia.com>
> wrote:
>> Hi,
>>
>> this series brings support for geometry shaders in Sandy Bridge (gen6)
>> and is
>> combined work from Samuel and myself. A few notes:
>>
>> 1.- Some patches have been based on original work by Ilia Mirkin,
>> specifically
>> the idea of using arrays to buffer the output of the GS, subclassing
>> the
>> vec4_gs_visitor for gen6 and generalizing emit_urb_slot().
>>
>> 2.- Geometry shaders were already being used in gen6 to implement
>> transform
>> feedback support for vertex shaders. We have not changed this. These
>> patches
>> focus on adding support for user-provided geometry shaders and
>> transform
>> feedback support for the geometry shader stage. In the future it
>> probably
>> makes sense to merge transform feedback support for the vertex shader
>> stage
>> in our implementation so there is only one code path for geometry
>> shaders
>> in gen6, but it is probably better to tackle that at a later moment,
>> once we
>> have merged this work.
>>
>> 2.- On Ivy Bridge there are no piglit regressions.
>>
>> 3.- On Sandy Bridge we get these results after enabling OpenGL 3.2 and
>> GLSL 1.50 (*1):
>>
>> crash: +0
>> fail: +15 (*2)
>> pass: +3265
>> skip: -3280
>
> Maybe a list of the failures? Or posting the piglit comparison results
> might be helpful.
>
> For example:
> http://people.freedesktop.org/~kwg/stuff/bdw-2014-05-13/summary/regressions.html
>
> This is not really a big deal, but it would just be nice to quickly
> see what tests are failing.
>
>> (*1) Including Jordan's patches from the series
>> "Gen6 render surface state changes" since these are required to enable
>> layered rendering in geometry shaders. The numbers were obtained by
>> comparing
>> master with Jordan's patches on top (OpenGL 3.1, GLSL 1.40) against
>> master
>> with these and Jordan's patches on top (OpenGL 3.2, GLSL 1.50)
>
> I finally pushed my gen6-layered series to master. (a1dca70)
>
> I wonder if you might push these patches to a publicly available
> branch?
>
> Thanks!
>
> -Jordan
Sure. Samuel, can you do this?
Iago
>> (*2) These are mostly tests that either fail in Ivy Bridge too, are GS
>> variants of tests that also fail for the VS/FS stages or relate to
>> other
>> aspects of OpenGL 3.2 that are not related with geometry shaders.
>>
>> 4.- With these patches, the following piglit test hangs:
>> bin/glsl-1.50-geometry-primitive-id-restart
>> GL_TRIANGLE_STRIP_ADJACENCY
>>
>> This problem seems to be unrelated to our implementation, since the
>> hang
>> happens only for that primitive type, only when using glDrawElements()
>> (so glDrawArrays works fine), and only in specific cases where the
>> list
>> of indices provided includes repeated indices with a certain pattern.
>> Actually,
>> this test hangs even if we have a geometry shader that does nothing
>> (i.e. an
>> empty main function), where the code we generate is trivial and works
>> with
>> any other primitive type. Based on this, I conclude that this is a
>> problem
>> originating somewhere else, I think probably a hardware bug. Because
>> of this,
>> piglit runs with these patches should exclude this test by including
>> "-x primitive-id-restart". The offending piglit test can be trivially
>> reworked
>> to avoid repeating indices in the call to glDrawElements() too. I'll
>> develop this issue further in another thread so we can decide what to
>> do about
>> this problem.
>>
>> I'll be on holidays for the next two weeks, starting tomorrow, but
>> Samuel will
>> be around since Tuesday next week so he can start acting on the review
>> feedback
>> we get.
>>
>> A quick summary of the patches:
>>
>> - Patch 1: is actually about gen7, but since gen6's dispatch mode for
>> geometry
>> shaders is equivalent to gen7's SINGLE mode it makes sense to do
>> this first.
>> - Patches 2-4 refactor 3DSTATE_GS to accomodate the code path for
>> user-provided
>> geometry shaders while keeping the original code that handles TF
>> support
>> in vertex shaders.
>> - Patches 5-13 implement generator opcodes, configure state packets
>> and
>> handle required URB space.
>> - Patches 14-15 generalize emit_urb_slot() so we can reuse that code.
>> - Patches 16-19 are the gen6 geometry shader visitor implementation.
>> - Patches 20-21 implement gl_PrimitiveIDIn.
>> - Patch 22 makes sure we compute the right VUE map for user-provided
>> GS.
>> - Patch 23 enables texture related functions in the GS stage.
>> - Patches 24-33 mostly implement transform feedback
>> - Patch 34 handles uploading of ubo and pull constant surfaces
>> - Patch 35 makes gen6 use this implementation of geometry shaders
>> - Patches 36-37 enable GLSL 1.5 and OpenGL 3.2 in gen6
>>
>> Iago Toral Quiroga (23):
>> i965/gs: Use single dispatch mode as fallback to dual object mode
>> when
>> possible.
>> i965/gen6/gs: Setup constant push buffers for gen6 geometry shaders.
>> i965/gen6/gs: Implement GS_OPCODE_FF_SYNC.
>> i965/gen6/gs: Implement GS_OPCODE_URB_WRITE_ALLOCATE.
>> i965/gen6/gs: Add instruction URB flags to geometry shaders EOT
>> message.
>> i965/gen6/gs: Compute URB entry size for user-provided geometry
>> shaders.
>> i965/gen6/gs: Enable URB space for user-provided geometry shaders.
>> i965/gen6/gs: Upload binding table for user-provided geometry
>> shaders.
>> i965/gen6/gs: Implement GS_OPCODE_SET_DWORD_2.
>> i965: Provide means to create registers of a given size.
>> i965: Generalize emit_urb_slot() to emit to any dst_reg.
>> i965/gen6/gs: Add initial implementation for a gen6 geometry shader
>> visitor.
>> i965/gen6/gs: Implement geometry shaders for outputs other than
>> points.
>> i965/gen6/gs: Make sure we complete the last primitive.
>> i965/gen6/gs: Handle the case where a geometry shader emits no
>> output.
>> i965/gen6/gs: Implement GS_OPCODE_SET_PRIMITIVE_ID.
>> i965/gen6/gs: Implement support for gl_PrimitiveIdIn.
>> i965/gen6/gs: Assign geometry shader VUE map properly.
>> i965/gen6/gs: Enable texture units and upload sampler state.
>> i965/gen6/gs: Avoid buffering transform feedback varyings twice.
>> i965/gen6/gs: Fix binding table clash between TF surfaces and
>> textures.
>> i965/gen6/gs: upload ubo and pull constants surfaces.
>> i965/gen6/gs: Use a specific implementation of geometry shaders for
>> gen6.
>>
>> Samuel Iglesias Gonsalvez (14):
>> i965/gen6/gs: refactor gen6_gs_state
>> i965/gen6/gs: use brw_gs_prog atom instead of brw_ff_gs_prog
>> i965/gen6/gs: Set brw->gs.enabled to FALSE in
>> gen6_blorp_emit_gs_disable()
>> i965/gs: Reuse gen6 constant push buffers setup code in gen7+.
>> i965/gen6/gs: implement GS_OPCODE_SVB_WRITE opcode
>> i965/gen6/gs: implement GS_OPCODE_SVB_SET_DST_INDEX opcode
>> i965/gen6/gs: implement GS_OPCODE_FF_SYNC_SET_PRIMITIVES opcode
>> i965/gen6/gs: Add an additional parameter to the FF_SYNC opcode.
>> i965/gen6/gs: implement transform feedback support in
>> gen6_gs_visitor
>> i965/gen6/gs: Setup SOL surfaces for user-provided geometry shaders
>> i965/gen6/gs: Buffer PSIZ/flags vertex data in gen6_gs_visitor
>> i965/gen6/gs: Enable transform feedback support in geometry shaders
>> i965/gen6: enable GLSL 1.50
>> i965/gen6: enable OpenGL 3.2
>>
>> src/mesa/drivers/dri/i965/Makefile.sources | 1 +
>> src/mesa/drivers/dri/i965/brw_binding_tables.c | 5 +-
>> src/mesa/drivers/dri/i965/brw_context.c | 2 +-
>> src/mesa/drivers/dri/i965/brw_context.h | 121 ++--
>> src/mesa/drivers/dri/i965/brw_defines.h | 86 ++-
>> src/mesa/drivers/dri/i965/brw_gs.c | 4 +
>> src/mesa/drivers/dri/i965/brw_gs.h | 1 +
>> src/mesa/drivers/dri/i965/brw_shader.cpp | 14 +
>> src/mesa/drivers/dri/i965/brw_state.h | 1 +
>> src/mesa/drivers/dri/i965/brw_state_upload.c | 10 +-
>> src/mesa/drivers/dri/i965/brw_vec4.cpp | 9 +-
>> src/mesa/drivers/dri/i965/brw_vec4.h | 28 +-
>> src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 199 +++++-
>> src/mesa/drivers/dri/i965/brw_vec4_gs.c | 102 ++-
>> src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 76 ++-
>> src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h | 2 +-
>> src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 44 +-
>> src/mesa/drivers/dri/i965/brw_vs.c | 2 +-
>> src/mesa/drivers/dri/i965/gen6_blorp.cpp | 1 +
>> src/mesa/drivers/dri/i965/gen6_gs_state.c | 161 ++++-
>> src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp | 775
>> ++++++++++++++++++++++
>> src/mesa/drivers/dri/i965/gen6_gs_visitor.h | 83 +++
>> src/mesa/drivers/dri/i965/gen6_sampler_state.c | 2 +-
>> src/mesa/drivers/dri/i965/gen6_sol.c | 155 +++--
>> src/mesa/drivers/dri/i965/gen6_urb.c | 30 +-
>> src/mesa/drivers/dri/i965/gen7_gs_state.c | 37 +-
>> src/mesa/drivers/dri/i965/gen8_gs_state.c | 4 +-
>> src/mesa/drivers/dri/i965/intel_extensions.c | 2 +-
>> src/mesa/drivers/dri/i965/intel_screen.c | 2 +-
>> 29 files changed, 1714 insertions(+), 245 deletions(-)
>> create mode 100644 src/mesa/drivers/dri/i965/gen6_gs_visitor.cpp
>> create mode 100644 src/mesa/drivers/dri/i965/gen6_gs_visitor.h
>>
>> --
>> 1.9.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list