[Mesa-dev] [RFC 03/24] nvc0: bind images on compute shaders for Kepler
Ilia Mirkin
imirkin at alum.mit.edu
Wed Apr 13 20:11:28 UTC 2016
On Wed, Apr 13, 2016 at 11:26 AM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
>
>
> On 04/13/2016 03:38 AM, Ilia Mirkin wrote:
>>
>> On Tue, Apr 12, 2016 at 7:56 PM, Samuel Pitoiset
>> <samuel.pitoiset at gmail.com> wrote:
>>>
>>> Old surfaces validation code will be removed once images are completely
>>> done for Fermi/Kepler, that explains why I only disable it for now.
>>>
>>> set_surface_info() which sticks surfaces information into the driver
>>> constant buffer needs to be updated because now we are dealing with
>>> pipe_image_view instead of pipe_surface.
>>>
>>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>>> ---
>>> src/gallium/drivers/nouveau/nvc0/nvc0_context.h | 5 ++-
>>> src/gallium/drivers/nouveau/nvc0/nvc0_program.c | 4 +-
>>> src/gallium/drivers/nouveau/nvc0/nvc0_tex.c | 54
>>> +++++++++++++------------
>>> src/gallium/drivers/nouveau/nvc0/nve4_compute.c | 37 ++++++++++++++++-
>>> 4 files changed, 72 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>>> b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>>> index 17733f5..107b737 100644
>>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>>> @@ -130,6 +130,9 @@
>>> /* 32 user buffers, at 4 32-bits integers each */
>>> #define NVC0_CB_AUX_BUF_INFO(i) 0x200 + (i) * 4 * 4
>>> #define NVC0_CB_AUX_BUF_SIZE (NVC0_MAX_BUFFERS * 4 * 4)
>>> +/* 8 surfaces, at 16 32-bits integers each */
>>> +#define NVC0_CB_AUX_SU_INFO(i) 0x400 + (i) * 16 * 4
>>> +#define nVC0_CB_AUX_SU_SIZE (NVC0_MAX_IMAGES * 16 * 4)
>>> /* 4 32-bits floats for the vertex runout, put at the end */
>>> #define NVC0_CB_AUX_RUNOUT_INFO NVC0_CB_USR_SIZE + NVC0_CB_AUX_SIZE
>>>
>>> @@ -324,7 +327,7 @@ void nvc0_validate_textures(struct nvc0_context *);
>>> void nvc0_validate_samplers(struct nvc0_context *);
>>> void nve4_set_tex_handles(struct nvc0_context *);
>>> void nvc0_validate_surfaces(struct nvc0_context *);
>>> -void nve4_set_surface_info(struct nouveau_pushbuf *, struct pipe_surface
>>> *,
>>> +void nve4_set_surface_info(struct nouveau_pushbuf *, struct
>>> pipe_image_view *,
>>> struct nvc0_screen *);
>>>
>>> struct pipe_sampler_view *
>>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
>>> b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
>>> index d3024f9..ced8130 100644
>>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
>>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
>>> @@ -551,11 +551,13 @@ nvc0_program_translate(struct nvc0_program *prog,
>>> uint16_t chipset,
>>> info->io.texBindBase = NVC0_CB_AUX_TEX_INFO(0);
>>> info->prop.cp.gridInfoBase = NVC0_CB_AUX_GRID_INFO;
>>> info->io.uboInfoBase = NVC0_CB_AUX_UBO_INFO(0);
>>> + info->io.suInfoBase = NVC0_CB_AUX_SU_INFO(0);
>>> + } else {
>>> + info->io.suInfoBase = 0; /* TODO */
>>> }
>>> info->io.msInfoCBSlot = 0;
>>> info->io.msInfoBase = NVC0_CB_AUX_MS_INFO;
>>> info->io.bufInfoBase = NVC0_CB_AUX_BUF_INFO(0);
>>> - info->io.suInfoBase = 0; /* TODO */
>>> } else {
>>> if (chipset >= NVISA_GK104_CHIPSET) {
>>> info->io.texBindBase = NVC0_CB_AUX_TEX_INFO(0);
>>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
>>> b/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
>>> index 647c2a6..585b1e5 100644
>>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
>>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
>>> @@ -745,21 +745,21 @@ static const uint16_t
>>> nve4_suldp_lib_offset[PIPE_FORMAT_COUNT];
>>>
>>> void
>>> nve4_set_surface_info(struct nouveau_pushbuf *push,
>>> - struct pipe_surface *psf,
>>> + struct pipe_image_view *view,
>>> struct nvc0_screen *screen)
>>> {
>>> - struct nv50_surface *sf = nv50_surface(psf);
>>> struct nv04_resource *res;
>>> uint64_t address;
>>> uint32_t *const info = push->cur;
>>> + int width, height, depth;
>>> uint8_t log2cpp;
>>>
>>> - if (psf && !nve4_su_format_map[psf->format])
>>> + if (view && !nve4_su_format_map[view->format])
>>> NOUVEAU_ERR("unsupported surface format, try
>>> is_format_supported() !\n");
>>>
>>> push->cur += 16;
>>>
>>> - if (!psf || !nve4_su_format_map[psf->format]) {
>>> + if (!view || !nve4_su_format_map[view->format]) {
>>> memset(info, 0, 16 * sizeof(*info));
>>>
>>> info[0] = 0xbadf0000;
>>> @@ -768,13 +768,17 @@ nve4_set_surface_info(struct nouveau_pushbuf *push,
>>> screen->lib_code->start;
>>> return;
>>> }
>>> - res = nv04_resource(sf->base.texture);
>>> + res = nv04_resource(view->resource);
>>>
>>> - address = res->address + sf->offset;
>>> + address = res->address;
>>>
>>> - info[8] = sf->width;
>>> - info[9] = sf->height;
>>> - info[10] = sf->depth;
>>> + width = u_minify(view->resource->width0, view->u.tex.level);
>>
>>
>> You never check that it's a texture... if it's a buffer, this is
>> undefined. AFAIK you have some later patch which rectifies this...
>> perhaps fold this in?
>
>
> This doesn't really matter because this code won't be hit until
> ARB_shader_image_load_store is enabled.
So? The code is wrong. We should try to avoid patches that have wrong
code in them, esp if there's a later patch in the series that fixes
it.
-ilia
More information about the mesa-dev
mailing list