Thank you! On Wednesday, January 7, 2015, Marek Olšák <mar...@gmail.com> wrote:
> On Wed, Jan 7, 2015 at 2:42 PM, Aditya Avinash <adityaavina...@gmail.com > <javascript:;>> wrote: > > Hi, > > Sounds great but, do you think a separate buffer pipe is required for > this? > > Changing Constant buffer to a generic buffer (with alu+load+store) can > help. > > No, constant buffers should remain unchanged. > > > > > What about for R600? Do we have to add > > > > r600_init_atom(rctx, &rctx->shaderbuf_state[PIPE_SHADER_VERTEX].atom, > id++, > > r600_emit_vs_shader_buffers, 0); > > > > to backend? Will this be specific to Atomics? > > No, atomic buffers should be set in the exact same way as colorbuffers > on r600 except that the RAT bit should be set. Search the r600g driver > for "RAT(1)". I think it supports them already. The shader > instructions for accessing such buffers begin with "MEM_RAT". > > Marek > > > > > Thank you!! > > > > On Wed, Jan 7, 2015 at 4:56 AM, Marek Olšák <mar...@gmail.com > <javascript:;>> wrote: > >> > >> From: Marek Olšák <marek.ol...@amd.com <javascript:;>> > >> > >> set_shader_resources is unused. > >> > >> set_shader_buffers should support shader atomic counter buffers and > shader > >> storage buffers from OpenGL. > >> > >> The plan is to use slots 0..15 for atomic counters and slots 16..31 > >> for storage buffers. Atomic counters are planned to be supported first. > >> > >> This doesn't add any interface for images. The documentation is added > >> for future reference. > >> --- > >> > >> This is the interface only. I don't plan to do anything else for now. > >> Comments welcome. > >> > >> src/gallium/docs/source/context.rst | 16 ++++++++-------- > >> src/gallium/docs/source/screen.rst | 4 ++-- > >> src/gallium/drivers/galahad/glhd_context.c | 2 +- > >> src/gallium/drivers/ilo/ilo_state.c | 2 +- > >> src/gallium/drivers/nouveau/nouveau_buffer.c | 2 +- > >> src/gallium/drivers/nouveau/nouveau_screen.c | 2 +- > >> src/gallium/drivers/nouveau/nv50/nv50_formats.c | 2 +- > >> src/gallium/drivers/nouveau/nvc0/nvc0_state.c | 2 +- > >> src/gallium/include/pipe/p_context.h | 20 > +++++++++++--------- > >> src/gallium/include/pipe/p_defines.h | 2 +- > >> src/gallium/include/pipe/p_state.h | 10 ++++++++++ > >> 11 files changed, 38 insertions(+), 26 deletions(-) > >> > >> diff --git a/src/gallium/docs/source/context.rst > >> b/src/gallium/docs/source/context.rst > >> index 5861f46..73fd35f 100644 > >> --- a/src/gallium/docs/source/context.rst > >> +++ b/src/gallium/docs/source/context.rst > >> @@ -126,14 +126,14 @@ from a shader without an associated sampler. This > >> means that they > >> have no support for floating point coordinates, address wrap modes or > >> filtering. > >> > >> -Shader resources are specified for all the shader stages at once using > >> -the ``set_shader_resources`` method. When binding texture resources, > >> -the ``level``, ``first_layer`` and ``last_layer`` pipe_surface fields > >> -specify the mipmap level and the range of layers the texture will be > >> -constrained to. In the case of buffers, ``first_element`` and > >> -``last_element`` specify the range within the buffer that will be used > >> -by the shader resource. Writes to a shader resource are only allowed > >> -when the ``writable`` flag is set. > >> +There are 2 types of shader resources: buffers and images. > >> + > >> +Buffers are specified using the ``set_shader_buffers`` method. > >> + > >> +Images are specified using the ``set_shader_images`` method. When > binding > >> +images, the ``level``, ``first_layer`` and ``last_layer`` > pipe_image_view > >> +fields specify the mipmap level and the range of layers the image will > be > >> +constrained to. > >> > >> Surfaces > >> ^^^^^^^^ > >> diff --git a/src/gallium/docs/source/screen.rst > >> b/src/gallium/docs/source/screen.rst > >> index 55d114c..c81ad66 100644 > >> --- a/src/gallium/docs/source/screen.rst > >> +++ b/src/gallium/docs/source/screen.rst > >> @@ -403,8 +403,8 @@ resources might be created and handled quite > >> differently. > >> process. > >> * ``PIPE_BIND_GLOBAL``: A buffer that can be mapped into the global > >> address space of a compute program. > >> -* ``PIPE_BIND_SHADER_RESOURCE``: A buffer or texture that can be > >> - bound to the graphics pipeline as a shader resource. > >> +* ``PIPE_BIND_SHADER_BUFFER``: A buffer that can be bound to a shader > >> where > >> + it should support reads, writes, and atomics. > >> * ``PIPE_BIND_COMPUTE_RESOURCE``: A buffer or texture that can be > >> bound to the compute program as a shader resource. > >> * ``PIPE_BIND_COMMAND_ARGS_BUFFER``: A buffer that may be sourced by > the > >> diff --git a/src/gallium/drivers/galahad/glhd_context.c > >> b/src/gallium/drivers/galahad/glhd_context.c > >> index 37ea170..383d76c 100644 > >> --- a/src/gallium/drivers/galahad/glhd_context.c > >> +++ b/src/gallium/drivers/galahad/glhd_context.c > >> @@ -1017,7 +1017,7 @@ galahad_context_create(struct pipe_screen > *_screen, > >> struct pipe_context *pipe) > >> GLHD_PIPE_INIT(set_scissor_states); > >> GLHD_PIPE_INIT(set_viewport_states); > >> GLHD_PIPE_INIT(set_sampler_views); > >> - //GLHD_PIPE_INIT(set_shader_resources); > >> + //GLHD_PIPE_INIT(set_shader_buffers); > >> GLHD_PIPE_INIT(set_vertex_buffers); > >> GLHD_PIPE_INIT(set_index_buffer); > >> GLHD_PIPE_INIT(create_stream_output_target); > >> diff --git a/src/gallium/drivers/ilo/ilo_state.c > >> b/src/gallium/drivers/ilo/ilo_state.c > >> index b852f9f..09209ec 100644 > >> --- a/src/gallium/drivers/ilo/ilo_state.c > >> +++ b/src/gallium/drivers/ilo/ilo_state.c > >> @@ -1267,7 +1267,7 @@ ilo_init_state_functions(struct ilo_context *ilo) > >> ilo->base.set_scissor_states = ilo_set_scissor_states; > >> ilo->base.set_viewport_states = ilo_set_viewport_states; > >> ilo->base.set_sampler_views = ilo_set_sampler_views; > >> - ilo->base.set_shader_resources = ilo_set_shader_resources; > >> + //ilo->base.set_shader_resources = ilo_set_shader_resources; > >> ilo->base.set_vertex_buffers = ilo_set_vertex_buffers; > >> ilo->base.set_index_buffer = ilo_set_index_buffer; > >> > >> diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c > >> b/src/gallium/drivers/nouveau/nouveau_buffer.c > >> index 49ff100..722c516 100644 > >> --- a/src/gallium/drivers/nouveau/nouveau_buffer.c > >> +++ b/src/gallium/drivers/nouveau/nouveau_buffer.c > >> @@ -44,7 +44,7 @@ nouveau_buffer_allocate(struct nouveau_screen *screen, > >> > >> if (buf->base.bind & (PIPE_BIND_CONSTANT_BUFFER | > >> PIPE_BIND_COMPUTE_RESOURCE | > >> - PIPE_BIND_SHADER_RESOURCE)) > >> + PIPE_BIND_SHADER_BUFFER)) > >> size = align(size, 0x100); > >> > >> if (domain == NOUVEAU_BO_VRAM) { > >> diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c > >> b/src/gallium/drivers/nouveau/nouveau_screen.c > >> index 517978d..68ab672 100644 > >> --- a/src/gallium/drivers/nouveau/nouveau_screen.c > >> +++ b/src/gallium/drivers/nouveau/nouveau_screen.c > >> @@ -197,7 +197,7 @@ nouveau_screen_init(struct nouveau_screen *screen, > >> struct nouveau_device *dev) > >> PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | > >> PIPE_BIND_CURSOR | > >> PIPE_BIND_SAMPLER_VIEW | > >> - PIPE_BIND_SHADER_RESOURCE | PIPE_BIND_COMPUTE_RESOURCE | > >> + PIPE_BIND_SHADER_BUFFER | PIPE_BIND_COMPUTE_RESOURCE | > >> PIPE_BIND_GLOBAL; > >> screen->sysmem_bindings = > >> PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_STREAM_OUTPUT | > >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_formats.c > >> b/src/gallium/drivers/nouveau/nv50/nv50_formats.c > >> index d394015..4fc8380 100644 > >> --- a/src/gallium/drivers/nouveau/nv50/nv50_formats.c > >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_formats.c > >> @@ -44,7 +44,7 @@ > >> */ > >> #define U_V PIPE_BIND_VERTEX_BUFFER > >> #define U_T PIPE_BIND_SAMPLER_VIEW > >> -#define U_I PIPE_BIND_SHADER_RESOURCE | PIPE_BIND_COMPUTE_RESOURCE > >> +#define U_I PIPE_BIND_SHADER_BUFFER | PIPE_BIND_COMPUTE_RESOURCE > >> #define U_TR PIPE_BIND_RENDER_TARGET | U_T > >> #define U_IR U_TR | U_I > >> #define U_TB PIPE_BIND_BLENDABLE | U_TR > >> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > >> b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > >> index 728618f..f8fb955 100644 > >> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > >> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c > >> @@ -1269,7 +1269,7 @@ nvc0_init_state_functions(struct nvc0_context > *nvc0) > >> > >> pipe->set_global_binding = nvc0_set_global_bindings; > >> pipe->set_compute_resources = nvc0_set_compute_resources; > >> - pipe->set_shader_resources = nvc0_set_shader_resources; > >> + //pipe->set_shader_resources = nvc0_set_shader_resources; > >> > >> nvc0->sample_mask = ~0; > >> nvc0->min_samples = 1; > >> diff --git a/src/gallium/include/pipe/p_context.h > >> b/src/gallium/include/pipe/p_context.h > >> index af5674f..641b93a 100644 > >> --- a/src/gallium/include/pipe/p_context.h > >> +++ b/src/gallium/include/pipe/p_context.h > >> @@ -57,6 +57,7 @@ struct pipe_resource; > >> struct pipe_sampler_state; > >> struct pipe_sampler_view; > >> struct pipe_scissor_state; > >> +struct pipe_shader_buffer; > >> struct pipe_shader_state; > >> struct pipe_stencil_ref; > >> struct pipe_stream_output_target; > >> @@ -222,20 +223,21 @@ struct pipe_context { > >> struct pipe_sampler_view **); > >> > >> /** > >> - * Bind an array of shader resources that will be used by the > >> - * graphics pipeline. Any resources that were previously bound to > >> - * the specified range will be unbound after this call. > >> + * Bind an array of shader buffers that will be used by a shader. > >> + * Any resources that were previously bound to the specified range > >> + * will be unbound. > >> * > >> - * \param start first resource to bind. > >> - * \param count number of consecutive resources to bind. > >> - * \param resources array of pointers to the resources to bind, it > >> + * \param shader shader stage where the buffers will be bound. > >> + * \param start_slot first buffer slot to bind. > >> + * \param count number of consecutive buffers to bind. > >> + * \param buffers array of pointers to the buffers to bind, it > >> * should contain at least \a count elements > >> * unless it's NULL, in which case no new > >> * resources will be bound. > >> */ > >> - void (*set_shader_resources)(struct pipe_context *, > >> - unsigned start, unsigned count, > >> - struct pipe_surface **resources); > >> + void (*set_shader_buffers)(struct pipe_context *, unsigned shader, > >> + unsigned start_slot, unsigned count, > >> + struct pipe_shader_buffer *buffers); > >> > >> void (*set_vertex_buffers)( struct pipe_context *, > >> unsigned start_slot, > >> diff --git a/src/gallium/include/pipe/p_defines.h > >> b/src/gallium/include/pipe/p_defines.h > >> index 6c5703a..b964fd6 100644 > >> --- a/src/gallium/include/pipe/p_defines.h > >> +++ b/src/gallium/include/pipe/p_defines.h > >> @@ -348,7 +348,7 @@ enum pipe_flush_flags { > >> #define PIPE_BIND_CURSOR (1 << 16) /* mouse cursor */ > >> #define PIPE_BIND_CUSTOM (1 << 17) /* > state-tracker/winsys > >> usages */ > >> #define PIPE_BIND_GLOBAL (1 << 18) /* set_global_binding > */ > >> -#define PIPE_BIND_SHADER_RESOURCE (1 << 19) /* > set_shader_resources > >> */ > >> +#define PIPE_BIND_SHADER_BUFFER (1 << 19) /* set_shader_buffers > */ > >> #define PIPE_BIND_COMPUTE_RESOURCE (1 << 20) /* > set_compute_resources > >> */ > >> #define PIPE_BIND_COMMAND_ARGS_BUFFER (1 << 21) /* > >> pipe_draw_info.indirect */ > >> > >> diff --git a/src/gallium/include/pipe/p_state.h > >> b/src/gallium/include/pipe/p_state.h > >> index 43bc48b..450a270 100644 > >> --- a/src/gallium/include/pipe/p_state.h > >> +++ b/src/gallium/include/pipe/p_state.h > >> @@ -464,6 +464,16 @@ struct pipe_constant_buffer { > >> > >> > >> /** > >> + * An untyped shader buffer supporting loads, stores, and atomics. > >> + */ > >> +struct pipe_shader_buffer { > >> + struct pipe_resource *buffer; /**< the actual buffer */ > >> + unsigned buffer_offset; /**< offset to start of data in buffer, in > >> bytes */ > >> + unsigned buffer_size; /**< how much data can be read in shader */ > >> +}; > >> + > >> + > >> +/** > >> * A stream output target. The structure specifies the range vertices > can > >> * be written to. > >> * > >> -- > >> 2.1.0 > >> > >> _______________________________________________ > >> mesa-dev mailing list > >> mesa-dev@lists.freedesktop.org <javascript:;> > >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev > > > > > > > > > > -- > > Regards, > > Aditya Atluri, > > USA. > > > -- Regards, *Aditya Atluri,* *USA.*
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev