[Mesa-dev] [PATCH 3/3] radeon/winsys: add async dma infrastructure

Jerome Glisse j.glisse at gmail.com
Sat Jan 5 16:56:44 PST 2013


On Sat, Jan 5, 2013 at 9:49 AM, Christian König <deathsimple at vodafone.de> wrote:
> On 04.01.2013 23:19, j.glisse at gmail.com wrote:
> [SNIP]
>
>> diff --git a/src/gallium/drivers/r300/r300_emit.c
>> b/src/gallium/drivers/r300/r300_emit.c
>> index d1ed4b3..c824821 100644
>> --- a/src/gallium/drivers/r300/r300_emit.c
>> +++ b/src/gallium/drivers/r300/r300_emit.c
>> @@ -1184,7 +1184,8 @@ validate:
>>               assert(tex && tex->buf && "cbuf is marked, but NULL!");
>>               r300->rws->cs_add_reloc(r300->cs, tex->cs_buf,
>>                                       RADEON_USAGE_READWRITE,
>> -                                    r300_surface(fb->cbufs[i])->domain);
>> +                                    r300_surface(fb->cbufs[i])->domain,
>> +                                    RADEON_RING_DMA);
>
>
> ??? DMA ring on R300? At least on first glance that looks quite odd, should
> probably be GFX ring instead.

Yeah it's cut and paste error i catched up that when testing on r3xx

>
>>           }
>>           /* ...depth buffer... */
>>           if (fb->zsbuf) {
>> @@ -1192,7 +1193,8 @@ validate:
>>               assert(tex && tex->buf && "zsbuf is marked, but NULL!");
>>               r300->rws->cs_add_reloc(r300->cs, tex->cs_buf,
>>                                       RADEON_USAGE_READWRITE,
>> -                                    r300_surface(fb->zsbuf)->domain);
>> +                                    r300_surface(fb->zsbuf)->domain,
>> +                                    RADEON_RING_DMA);
>
>
> Same here and repeats on a couple of more places.
> [SNIP]
>
>
>> diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h
>> b/src/gallium/winsys/radeon/drm/radeon_winsys.h
>> index 16536dc..5ff463e 100644
>> --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
>> +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
>> @@ -43,11 +43,13 @@
>>   #include "pipebuffer/pb_buffer.h"
>>   #include "libdrm/radeon_surface.h"
>>   -#define RADEON_MAX_CMDBUF_DWORDS (16 * 1024)
>> +#define RADEON_MAX_CMDBUF_DWORDS        (16 * 1024)
>>   -#define RADEON_FLUSH_ASYNC           (1 << 0)
>> -#define RADEON_FLUSH_KEEP_TILING_FLAGS (1 << 1) /* needs DRM 2.12.0 */
>> -#define RADEON_FLUSH_COMPUTE           (1 << 2)
>> +#define RADEON_FLUSH_ASYNC              (1 << 0)
>> +#define RADEON_FLUSH_KEEP_TILING_FLAGS  (1 << 1) /* needs DRM 2.12.0 */
>> +#define RADEON_FLUSH_COMPUTE            (1 << 2)
>> +#define RADEON_FLUSH_DMA                (1 << 3)
>> +#define RADEON_FLUSH_GFX                (1 << 4)
>>     /* Tiling flags. */
>>   enum radeon_bo_layout {
>> @@ -137,12 +139,19 @@ enum chip_class {
>>       TAHITI,
>>   };
>>   +enum radeon_ring_type {
>> +    RADEON_RING_PM4 = 0,
>> +    RADEON_RING_DMA = 1,
>> +};
>> +
>
>
> Don't use PM4 as identifier here, the PM4 packet format is used for other
> ring types beside GFX/Compute as well, but those rings can't necessary
> execute GFX/Compute commands.

I was looking for a 3 letter name that encompass gfx and compute

>>   struct winsys_handle;
>>   struct radeon_winsys_cs_handle;
>>     struct radeon_winsys_cs {
>> -    unsigned cdw;  /* Number of used dwords. */
>> -    uint32_t *buf; /* The command buffer. */
>> +    unsigned                    cdw;      /* Number of used dwords. */
>> +    uint32_t                    *buf;     /* The command buffer. */
>> +    unsigned                    dma_cdw;  /* Number of used dwords. */
>> +    uint32_t                    *dma_buf; /* The command buffer. */
>>   };
>
>
> Why like this? Can't we just have separate instances of the radeon_winsys_cs
> structure for each ring type we are dealing with?
>
> The rest looks quite good,
> Christian.

No we can't we need to keep track at the same time for same context of
the dma ring and the gfx/compute/uvd/other ring It's the relocation
code that needs that.

Cheers,
Jerome


More information about the mesa-dev mailing list