[PATCH] drm/radeon/kms: add a CS ioctl flag not to rewrite tiling flags in the CS
Marek Olšák
maraeo at gmail.com
Sat Nov 19 12:49:30 PST 2011
Ping. Will anyone pick up this patch, please?
Marek
On Tue, Oct 25, 2011 at 1:38 AM, Marek Olšák <maraeo at gmail.com> wrote:
> This adds a new optional chunk to the CS ioctl that specifies optional flags
> to the CS parser. Why this is useful is explained below. Note that some regs
> no longer need the NOP relocation packet if this feature is enabled.
> Tested on r300g and r600g with this flag disabled and enabled.
>
> Assume there are two contexts sharing the same mipmapped tiled texture.
> One context wants to render into the first mipmap and the other one
> wants to render into the last mipmap. As you probably know, the hardware
> has a MACRO_SWITCH feature, which turns off macro tiling for small mipmaps,
> but that only applies to samplers.
> (at least on r300-r500, though later hardware likely behaves the same)
>
> So we want to just re-set the tiling flags before rendering (writing
> packets), right? ... No. The contexts run in parallel, so they may
> set the tiling flags simultaneously and then fire their command streams
> also simultaneously. The last one setting the flags wins, the other one
> loses.
>
> Another problem is when one context wants to render into the first and
> the last mipmap in one CS. Impossible. It must flush before changing
> tiling flags and do the rendering into the smaller mipmaps in another CS.
>
> Yet another problem is that writing copy_blit in userspace would be a mess
> involving re-setting tiling flags to please the kernel, and causing races
> with other contexts at the same time.
>
> The only way out of this is to send tiling flags with each CS, ideally
> with each relocation. But we already do that through the registers.
> So let's just use what we have in the registers.
>
> Signed-off-by: Marek Olšák <maraeo at gmail.com>
> ---
> drivers/gpu/drm/radeon/evergreen_cs.c | 92 +++++++++++++++++---------------
> drivers/gpu/drm/radeon/r300.c | 94 ++++++++++++++++++---------------
> drivers/gpu/drm/radeon/r600_cs.c | 26 ++++++----
> drivers/gpu/drm/radeon/radeon.h | 3 +-
> drivers/gpu/drm/radeon/radeon_cs.c | 11 ++++-
> drivers/gpu/drm/radeon/radeon_drv.c | 3 +-
> include/drm/radeon_drm.h | 4 ++
> 7 files changed, 135 insertions(+), 98 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
> index a134790..86b060c 100644
> --- a/drivers/gpu/drm/radeon/evergreen_cs.c
> +++ b/drivers/gpu/drm/radeon/evergreen_cs.c
> @@ -508,21 +508,23 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
> }
> break;
> case DB_Z_INFO:
> - r = evergreen_cs_packet_next_reloc(p, &reloc);
> - if (r) {
> - dev_warn(p->dev, "bad SET_CONTEXT_REG "
> - "0x%04X\n", reg);
> - return -EINVAL;
> - }
> track->db_z_info = radeon_get_ib_value(p, idx);
> - ib[idx] &= ~Z_ARRAY_MODE(0xf);
> - track->db_z_info &= ~Z_ARRAY_MODE(0xf);
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
> - ib[idx] |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - track->db_z_info |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - } else {
> - ib[idx] |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> - track->db_z_info |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + if (!p->keep_tiling_flags) {
> + r = evergreen_cs_packet_next_reloc(p, &reloc);
> + if (r) {
> + dev_warn(p->dev, "bad SET_CONTEXT_REG "
> + "0x%04X\n", reg);
> + return -EINVAL;
> + }
> + ib[idx] &= ~Z_ARRAY_MODE(0xf);
> + track->db_z_info &= ~Z_ARRAY_MODE(0xf);
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
> + ib[idx] |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + track->db_z_info |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + } else {
> + ib[idx] |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + track->db_z_info |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + }
> }
> break;
> case DB_STENCIL_INFO:
> @@ -635,40 +637,44 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
> case CB_COLOR5_INFO:
> case CB_COLOR6_INFO:
> case CB_COLOR7_INFO:
> - r = evergreen_cs_packet_next_reloc(p, &reloc);
> - if (r) {
> - dev_warn(p->dev, "bad SET_CONTEXT_REG "
> - "0x%04X\n", reg);
> - return -EINVAL;
> - }
> tmp = (reg - CB_COLOR0_INFO) / 0x3c;
> track->cb_color_info[tmp] = radeon_get_ib_value(p, idx);
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
> - ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
> - ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> - track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + if (!p->keep_tiling_flags) {
> + r = evergreen_cs_packet_next_reloc(p, &reloc);
> + if (r) {
> + dev_warn(p->dev, "bad SET_CONTEXT_REG "
> + "0x%04X\n", reg);
> + return -EINVAL;
> + }
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
> + ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
> + ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + }
> }
> break;
> case CB_COLOR8_INFO:
> case CB_COLOR9_INFO:
> case CB_COLOR10_INFO:
> case CB_COLOR11_INFO:
> - r = evergreen_cs_packet_next_reloc(p, &reloc);
> - if (r) {
> - dev_warn(p->dev, "bad SET_CONTEXT_REG "
> - "0x%04X\n", reg);
> - return -EINVAL;
> - }
> tmp = ((reg - CB_COLOR8_INFO) / 0x1c) + 8;
> track->cb_color_info[tmp] = radeon_get_ib_value(p, idx);
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
> - ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
> - ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> - track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + if (!p->keep_tiling_flags) {
> + r = evergreen_cs_packet_next_reloc(p, &reloc);
> + if (r) {
> + dev_warn(p->dev, "bad SET_CONTEXT_REG "
> + "0x%04X\n", reg);
> + return -EINVAL;
> + }
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
> + ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + } else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
> + ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + }
> }
> break;
> case CB_COLOR0_PITCH:
> @@ -1339,10 +1345,12 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
> return -EINVAL;
> }
> ib[idx+1+(i*8)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> - ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> - else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> - ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + if (!p->keep_tiling_flags) {
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> + ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
> + else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> + ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
> + }
> texture = reloc->robj;
> /* tex mip base */
> r = evergreen_cs_packet_next_reloc(p, &reloc);
> diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
> index 55a7f19..058c311 100644
> --- a/drivers/gpu/drm/radeon/r300.c
> +++ b/drivers/gpu/drm/radeon/r300.c
> @@ -708,16 +708,21 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
> return r;
> }
>
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> - tile_flags |= R300_TXO_MACRO_TILE;
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> - tile_flags |= R300_TXO_MICRO_TILE;
> - else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
> - tile_flags |= R300_TXO_MICRO_TILE_SQUARE;
> -
> - tmp = idx_value + ((u32)reloc->lobj.gpu_offset);
> - tmp |= tile_flags;
> - ib[idx] = tmp;
> + if (p->keep_tiling_flags) {
> + ib[idx] = (idx_value & 31) | /* keep the 1st 5 bits */
> + ((idx_value & ~31) + (u32)reloc->lobj.gpu_offset);
> + } else {
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> + tile_flags |= R300_TXO_MACRO_TILE;
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> + tile_flags |= R300_TXO_MICRO_TILE;
> + else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
> + tile_flags |= R300_TXO_MICRO_TILE_SQUARE;
> +
> + tmp = idx_value + ((u32)reloc->lobj.gpu_offset);
> + tmp |= tile_flags;
> + ib[idx] = tmp;
> + }
> track->textures[i].robj = reloc->robj;
> track->tex_dirty = true;
> break;
> @@ -767,24 +772,26 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
> /* RB3D_COLORPITCH1 */
> /* RB3D_COLORPITCH2 */
> /* RB3D_COLORPITCH3 */
> - r = r100_cs_packet_next_reloc(p, &reloc);
> - if (r) {
> - DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
> - idx, reg);
> - r100_cs_dump_packet(p, pkt);
> - return r;
> - }
> + if (!p->keep_tiling_flags) {
> + r = r100_cs_packet_next_reloc(p, &reloc);
> + if (r) {
> + DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
> + idx, reg);
> + r100_cs_dump_packet(p, pkt);
> + return r;
> + }
>
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> - tile_flags |= R300_COLOR_TILE_ENABLE;
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> - tile_flags |= R300_COLOR_MICROTILE_ENABLE;
> - else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
> - tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE;
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> + tile_flags |= R300_COLOR_TILE_ENABLE;
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> + tile_flags |= R300_COLOR_MICROTILE_ENABLE;
> + else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
> + tile_flags |= R300_COLOR_MICROTILE_SQUARE_ENABLE;
>
> - tmp = idx_value & ~(0x7 << 16);
> - tmp |= tile_flags;
> - ib[idx] = tmp;
> + tmp = idx_value & ~(0x7 << 16);
> + tmp |= tile_flags;
> + ib[idx] = tmp;
> + }
> i = (reg - 0x4E38) >> 2;
> track->cb[i].pitch = idx_value & 0x3FFE;
> switch (((idx_value >> 21) & 0xF)) {
> @@ -850,25 +857,26 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
> break;
> case 0x4F24:
> /* ZB_DEPTHPITCH */
> - r = r100_cs_packet_next_reloc(p, &reloc);
> - if (r) {
> - DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
> - idx, reg);
> - r100_cs_dump_packet(p, pkt);
> - return r;
> - }
> -
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> - tile_flags |= R300_DEPTHMACROTILE_ENABLE;
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> - tile_flags |= R300_DEPTHMICROTILE_TILED;
> - else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
> - tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE;
> + if (!p->keep_tiling_flags) {
> + r = r100_cs_packet_next_reloc(p, &reloc);
> + if (r) {
> + DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
> + idx, reg);
> + r100_cs_dump_packet(p, pkt);
> + return r;
> + }
>
> - tmp = idx_value & ~(0x7 << 16);
> - tmp |= tile_flags;
> - ib[idx] = tmp;
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> + tile_flags |= R300_DEPTHMACROTILE_ENABLE;
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> + tile_flags |= R300_DEPTHMICROTILE_TILED;
> + else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO_SQUARE)
> + tile_flags |= R300_DEPTHMICROTILE_TILED_SQUARE;
>
> + tmp = idx_value & ~(0x7 << 16);
> + tmp |= tile_flags;
> + ib[idx] = tmp;
> + }
> track->zb.pitch = idx_value & 0x3FFC;
> track->zb_dirty = true;
> break;
> diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
> index cf83aa0..9e78dfb 100644
> --- a/drivers/gpu/drm/radeon/r600_cs.c
> +++ b/drivers/gpu/drm/radeon/r600_cs.c
> @@ -960,7 +960,8 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
> track->db_depth_control = radeon_get_ib_value(p, idx);
> break;
> case R_028010_DB_DEPTH_INFO:
> - if (r600_cs_packet_next_is_pkt3_nop(p)) {
> + if (!p->keep_tiling_flags &&
> + r600_cs_packet_next_is_pkt3_nop(p)) {
> r = r600_cs_packet_next_reloc(p, &reloc);
> if (r) {
> dev_warn(p->dev, "bad SET_CONTEXT_REG "
> @@ -1011,7 +1012,8 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
> case R_0280B4_CB_COLOR5_INFO:
> case R_0280B8_CB_COLOR6_INFO:
> case R_0280BC_CB_COLOR7_INFO:
> - if (r600_cs_packet_next_is_pkt3_nop(p)) {
> + if (!p->keep_tiling_flags &&
> + r600_cs_packet_next_is_pkt3_nop(p)) {
> r = r600_cs_packet_next_reloc(p, &reloc);
> if (r) {
> dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg);
> @@ -1310,10 +1312,12 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
> mip_offset <<= 8;
>
> word0 = radeon_get_ib_value(p, idx + 0);
> - if (tiling_flags & RADEON_TILING_MACRO)
> - word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
> - else if (tiling_flags & RADEON_TILING_MICRO)
> - word0 |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
> + if (!p->keep_tiling_flags) {
> + if (tiling_flags & RADEON_TILING_MACRO)
> + word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
> + else if (tiling_flags & RADEON_TILING_MICRO)
> + word0 |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
> + }
> word1 = radeon_get_ib_value(p, idx + 1);
> w0 = G_038000_TEX_WIDTH(word0) + 1;
> h0 = G_038004_TEX_HEIGHT(word1) + 1;
> @@ -1640,10 +1644,12 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
> return -EINVAL;
> }
> base_offset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
> - if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> - ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
> - else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> - ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
> + if (!p->keep_tiling_flags) {
> + if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
> + ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
> + else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
> + ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
> + }
> texture = reloc->robj;
> /* tex mip base */
> r = r600_cs_packet_next_reloc(p, &reloc);
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index c1e056b..7ae80c7 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -596,7 +596,8 @@ struct radeon_cs_parser {
> struct radeon_ib *ib;
> void *track;
> unsigned family;
> - int parser_error;
> + int parser_error;
> + bool keep_tiling_flags;
> };
>
> extern int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx);
> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
> index fae00c0..44e4201 100644
> --- a/drivers/gpu/drm/radeon/radeon_cs.c
> +++ b/drivers/gpu/drm/radeon/radeon_cs.c
> @@ -93,7 +93,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> {
> struct drm_radeon_cs *cs = data;
> uint64_t *chunk_array_ptr;
> - unsigned size, i;
> + unsigned size, i, flags = 0;
>
> if (!cs->num_chunks) {
> return 0;
> @@ -140,6 +140,10 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> if (p->chunks[i].length_dw == 0)
> return -EINVAL;
> }
> + if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS &&
> + !p->chunks[i].length_dw) {
> + return -EINVAL;
> + }
>
> p->chunks[i].length_dw = user_chunk.length_dw;
> p->chunks[i].user_ptr = (void __user *)(unsigned long)user_chunk.chunk_data;
> @@ -155,6 +159,9 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> p->chunks[i].user_ptr, size)) {
> return -EFAULT;
> }
> + if (p->chunks[i].chunk_id == RADEON_CHUNK_ID_FLAGS) {
> + flags = p->chunks[i].kdata[0];
> + }
> } else {
> p->chunks[i].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL);
> p->chunks[i].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL);
> @@ -174,6 +181,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
> p->chunks[p->chunk_ib_idx].length_dw);
> return -EINVAL;
> }
> +
> + p->keep_tiling_flags = (flags & RADEON_CS_KEEP_TILING_FLAGS) != 0;
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
> index e71d2ed..aea2218 100644
> --- a/drivers/gpu/drm/radeon/radeon_drv.c
> +++ b/drivers/gpu/drm/radeon/radeon_drv.c
> @@ -52,9 +52,10 @@
> * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query
> * 2.10.0 - fusion 2D tiling
> * 2.11.0 - backend map, initial compute support for the CS checker
> + * 2.12.0 - RADEON_CS_KEEP_TILING_FLAGS
> */
> #define KMS_DRIVER_MAJOR 2
> -#define KMS_DRIVER_MINOR 11
> +#define KMS_DRIVER_MINOR 12
> #define KMS_DRIVER_PATCHLEVEL 0
> int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
> int radeon_driver_unload_kms(struct drm_device *dev);
> diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h
> index b65be60..be94be6 100644
> --- a/include/drm/radeon_drm.h
> +++ b/include/drm/radeon_drm.h
> @@ -874,6 +874,10 @@ struct drm_radeon_gem_pwrite {
>
> #define RADEON_CHUNK_ID_RELOCS 0x01
> #define RADEON_CHUNK_ID_IB 0x02
> +#define RADEON_CHUNK_ID_FLAGS 0x03
> +
> +/* The first dword of RADEON_CHUNK_ID_FLAGS is a uint32 of these flags: */
> +#define RADEON_CS_KEEP_TILING_FLAGS 0x01
>
> struct drm_radeon_cs_chunk {
> uint32_t chunk_id;
> --
> 1.7.4.1
>
>
More information about the dri-devel
mailing list