r600g: compute tiling info in the pipe, not in the winsys
The winsys doesn't need it.
This commit is contained in:
parent
a94e33a8ef
commit
3603d15788
|
@ -84,7 +84,6 @@ struct r600_tiling_info {
|
||||||
|
|
||||||
enum radeon_family r600_get_family(struct radeon *rw);
|
enum radeon_family r600_get_family(struct radeon *rw);
|
||||||
enum chip_class r600_get_family_class(struct radeon *radeon);
|
enum chip_class r600_get_family_class(struct radeon *radeon);
|
||||||
struct r600_tiling_info *r600_get_tiling_info(struct radeon *radeon);
|
|
||||||
unsigned r600_get_clock_crystal_freq(struct radeon *radeon);
|
unsigned r600_get_clock_crystal_freq(struct radeon *radeon);
|
||||||
unsigned r600_get_minor_version(struct radeon *radeon);
|
unsigned r600_get_minor_version(struct radeon *radeon);
|
||||||
unsigned r600_get_num_backends(struct radeon *radeon);
|
unsigned r600_get_num_backends(struct radeon *radeon);
|
||||||
|
|
|
@ -589,18 +589,140 @@ static boolean r600_fence_finish(struct pipe_screen *pscreen,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int r600_interpret_tiling(struct r600_screen *rscreen, uint32_t tiling_config)
|
||||||
|
{
|
||||||
|
switch ((tiling_config & 0xe) >> 1) {
|
||||||
|
case 0:
|
||||||
|
rscreen->tiling_info.num_channels = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rscreen->tiling_info.num_channels = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rscreen->tiling_info.num_channels = 4;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rscreen->tiling_info.num_channels = 8;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((tiling_config & 0x30) >> 4) {
|
||||||
|
case 0:
|
||||||
|
rscreen->tiling_info.num_banks = 4;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rscreen->tiling_info.num_banks = 8;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
}
|
||||||
|
switch ((tiling_config & 0xc0) >> 6) {
|
||||||
|
case 0:
|
||||||
|
rscreen->tiling_info.group_bytes = 256;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rscreen->tiling_info.group_bytes = 512;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int evergreen_interpret_tiling(struct r600_screen *rscreen, uint32_t tiling_config)
|
||||||
|
{
|
||||||
|
switch (tiling_config & 0xf) {
|
||||||
|
case 0:
|
||||||
|
rscreen->tiling_info.num_channels = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rscreen->tiling_info.num_channels = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rscreen->tiling_info.num_channels = 4;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rscreen->tiling_info.num_channels = 8;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((tiling_config & 0xf0) >> 4) {
|
||||||
|
case 0:
|
||||||
|
rscreen->tiling_info.num_banks = 4;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rscreen->tiling_info.num_banks = 8;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rscreen->tiling_info.num_banks = 16;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ((tiling_config & 0xf00) >> 8) {
|
||||||
|
case 0:
|
||||||
|
rscreen->tiling_info.group_bytes = 256;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rscreen->tiling_info.group_bytes = 512;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int r600_init_tiling(struct r600_screen *rscreen)
|
||||||
|
{
|
||||||
|
uint32_t tiling_config = rscreen->info.r600_tiling_config;
|
||||||
|
|
||||||
|
/* set default group bytes, overridden by tiling info ioctl */
|
||||||
|
if (r600_get_family_class(rscreen->radeon) <= R700) {
|
||||||
|
rscreen->tiling_info.group_bytes = 256;
|
||||||
|
} else {
|
||||||
|
rscreen->tiling_info.group_bytes = 512;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tiling_config)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (r600_get_family_class(rscreen->radeon) <= R700) {
|
||||||
|
return r600_interpret_tiling(rscreen, tiling_config);
|
||||||
|
} else {
|
||||||
|
return evergreen_interpret_tiling(rscreen, tiling_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct pipe_screen *r600_screen_create(struct radeon_winsys *ws)
|
struct pipe_screen *r600_screen_create(struct radeon_winsys *ws)
|
||||||
{
|
{
|
||||||
struct r600_screen *rscreen;
|
struct r600_screen *rscreen;
|
||||||
struct radeon *radeon = radeon_create(ws);
|
struct radeon *radeon = radeon_create(ws);
|
||||||
|
if (!radeon) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rscreen = CALLOC_STRUCT(r600_screen);
|
rscreen = CALLOC_STRUCT(r600_screen);
|
||||||
if (rscreen == NULL) {
|
if (rscreen == NULL) {
|
||||||
|
radeon_destroy(radeon);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rscreen->ws = ws;
|
rscreen->ws = ws;
|
||||||
rscreen->radeon = radeon;
|
rscreen->radeon = radeon;
|
||||||
|
ws->query_info(ws, &rscreen->info);
|
||||||
|
|
||||||
|
if (r600_init_tiling(rscreen)) {
|
||||||
|
radeon_destroy(radeon);
|
||||||
|
FREE(rscreen);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rscreen->screen.winsys = (struct pipe_winsys*)ws;
|
rscreen->screen.winsys = (struct pipe_winsys*)ws;
|
||||||
rscreen->screen.destroy = r600_destroy_screen;
|
rscreen->screen.destroy = r600_destroy_screen;
|
||||||
rscreen->screen.get_name = r600_get_name;
|
rscreen->screen.get_name = r600_get_name;
|
||||||
|
@ -621,7 +743,6 @@ struct pipe_screen *r600_screen_create(struct radeon_winsys *ws)
|
||||||
rscreen->screen.fence_finish = r600_fence_finish;
|
rscreen->screen.fence_finish = r600_fence_finish;
|
||||||
r600_init_screen_resource_functions(&rscreen->screen);
|
r600_init_screen_resource_functions(&rscreen->screen);
|
||||||
|
|
||||||
rscreen->tiling_info = r600_get_tiling_info(radeon);
|
|
||||||
util_format_s3tc_init();
|
util_format_s3tc_init();
|
||||||
|
|
||||||
util_slab_create(&rscreen->pool_buffers,
|
util_slab_create(&rscreen->pool_buffers,
|
||||||
|
|
|
@ -76,7 +76,8 @@ struct r600_screen {
|
||||||
struct pipe_screen screen;
|
struct pipe_screen screen;
|
||||||
struct radeon_winsys *ws;
|
struct radeon_winsys *ws;
|
||||||
struct radeon *radeon;
|
struct radeon *radeon;
|
||||||
struct r600_tiling_info *tiling_info;
|
struct radeon_info info;
|
||||||
|
struct r600_tiling_info tiling_info;
|
||||||
struct util_slab_mempool pool_buffers;
|
struct util_slab_mempool pool_buffers;
|
||||||
unsigned num_contexts;
|
unsigned num_contexts;
|
||||||
|
|
||||||
|
|
|
@ -93,19 +93,19 @@ static unsigned r600_get_block_alignment(struct pipe_screen *screen,
|
||||||
switch(array_mode) {
|
switch(array_mode) {
|
||||||
case V_038000_ARRAY_1D_TILED_THIN1:
|
case V_038000_ARRAY_1D_TILED_THIN1:
|
||||||
p_align = MAX2(8,
|
p_align = MAX2(8,
|
||||||
((rscreen->tiling_info->group_bytes / 8 / pixsize)));
|
((rscreen->tiling_info.group_bytes / 8 / pixsize)));
|
||||||
break;
|
break;
|
||||||
case V_038000_ARRAY_2D_TILED_THIN1:
|
case V_038000_ARRAY_2D_TILED_THIN1:
|
||||||
p_align = MAX2(rscreen->tiling_info->num_banks,
|
p_align = MAX2(rscreen->tiling_info.num_banks,
|
||||||
(((rscreen->tiling_info->group_bytes / 8 / pixsize)) *
|
(((rscreen->tiling_info.group_bytes / 8 / pixsize)) *
|
||||||
rscreen->tiling_info->num_banks)) * 8;
|
rscreen->tiling_info.num_banks)) * 8;
|
||||||
break;
|
break;
|
||||||
case V_038000_ARRAY_LINEAR_ALIGNED:
|
case V_038000_ARRAY_LINEAR_ALIGNED:
|
||||||
p_align = MAX2(64, rscreen->tiling_info->group_bytes / pixsize);
|
p_align = MAX2(64, rscreen->tiling_info.group_bytes / pixsize);
|
||||||
break;
|
break;
|
||||||
case V_038000_ARRAY_LINEAR_GENERAL:
|
case V_038000_ARRAY_LINEAR_GENERAL:
|
||||||
default:
|
default:
|
||||||
p_align = rscreen->tiling_info->group_bytes / pixsize;
|
p_align = rscreen->tiling_info.group_bytes / pixsize;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return p_align;
|
return p_align;
|
||||||
|
@ -119,7 +119,7 @@ static unsigned r600_get_height_alignment(struct pipe_screen *screen,
|
||||||
|
|
||||||
switch (array_mode) {
|
switch (array_mode) {
|
||||||
case V_038000_ARRAY_2D_TILED_THIN1:
|
case V_038000_ARRAY_2D_TILED_THIN1:
|
||||||
h_align = rscreen->tiling_info->num_channels * 8;
|
h_align = rscreen->tiling_info.num_channels * 8;
|
||||||
break;
|
break;
|
||||||
case V_038000_ARRAY_1D_TILED_THIN1:
|
case V_038000_ARRAY_1D_TILED_THIN1:
|
||||||
case V_038000_ARRAY_LINEAR_ALIGNED:
|
case V_038000_ARRAY_LINEAR_ALIGNED:
|
||||||
|
@ -145,14 +145,14 @@ static unsigned r600_get_base_alignment(struct pipe_screen *screen,
|
||||||
|
|
||||||
switch (array_mode) {
|
switch (array_mode) {
|
||||||
case V_038000_ARRAY_2D_TILED_THIN1:
|
case V_038000_ARRAY_2D_TILED_THIN1:
|
||||||
b_align = MAX2(rscreen->tiling_info->num_banks * rscreen->tiling_info->num_channels * 8 * 8 * pixsize,
|
b_align = MAX2(rscreen->tiling_info.num_banks * rscreen->tiling_info.num_channels * 8 * 8 * pixsize,
|
||||||
p_align * pixsize * h_align);
|
p_align * pixsize * h_align);
|
||||||
break;
|
break;
|
||||||
case V_038000_ARRAY_1D_TILED_THIN1:
|
case V_038000_ARRAY_1D_TILED_THIN1:
|
||||||
case V_038000_ARRAY_LINEAR_ALIGNED:
|
case V_038000_ARRAY_LINEAR_ALIGNED:
|
||||||
case V_038000_ARRAY_LINEAR_GENERAL:
|
case V_038000_ARRAY_LINEAR_GENERAL:
|
||||||
default:
|
default:
|
||||||
b_align = rscreen->tiling_info->group_bytes;
|
b_align = rscreen->tiling_info.group_bytes;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return b_align;
|
return b_align;
|
||||||
|
|
|
@ -41,11 +41,6 @@ enum chip_class r600_get_family_class(struct radeon *radeon)
|
||||||
return radeon->chip_class;
|
return radeon->chip_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct r600_tiling_info *r600_get_tiling_info(struct radeon *radeon)
|
|
||||||
{
|
|
||||||
return &radeon->tiling_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned r600_get_clock_crystal_freq(struct radeon *radeon)
|
unsigned r600_get_clock_crystal_freq(struct radeon *radeon)
|
||||||
{
|
{
|
||||||
return radeon->info.r600_clock_crystal_freq;
|
return radeon->info.r600_clock_crystal_freq;
|
||||||
|
@ -71,110 +66,6 @@ unsigned r600_get_minor_version(struct radeon *radeon)
|
||||||
return radeon->info.drm_minor;
|
return radeon->info.drm_minor;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int r600_interpret_tiling(struct radeon *radeon, uint32_t tiling_config)
|
|
||||||
{
|
|
||||||
switch ((tiling_config & 0xe) >> 1) {
|
|
||||||
case 0:
|
|
||||||
radeon->tiling_info.num_channels = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
radeon->tiling_info.num_channels = 2;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
radeon->tiling_info.num_channels = 4;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
radeon->tiling_info.num_channels = 8;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ((tiling_config & 0x30) >> 4) {
|
|
||||||
case 0:
|
|
||||||
radeon->tiling_info.num_banks = 4;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
radeon->tiling_info.num_banks = 8;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
}
|
|
||||||
switch ((tiling_config & 0xc0) >> 6) {
|
|
||||||
case 0:
|
|
||||||
radeon->tiling_info.group_bytes = 256;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
radeon->tiling_info.group_bytes = 512;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int eg_interpret_tiling(struct radeon *radeon, uint32_t tiling_config)
|
|
||||||
{
|
|
||||||
switch (tiling_config & 0xf) {
|
|
||||||
case 0:
|
|
||||||
radeon->tiling_info.num_channels = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
radeon->tiling_info.num_channels = 2;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
radeon->tiling_info.num_channels = 4;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
radeon->tiling_info.num_channels = 8;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ((tiling_config & 0xf0) >> 4) {
|
|
||||||
case 0:
|
|
||||||
radeon->tiling_info.num_banks = 4;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
radeon->tiling_info.num_banks = 8;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
radeon->tiling_info.num_banks = 16;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ((tiling_config & 0xf00) >> 8) {
|
|
||||||
case 0:
|
|
||||||
radeon->tiling_info.group_bytes = 256;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
radeon->tiling_info.group_bytes = 512;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int radeon_drm_get_tiling(struct radeon *radeon)
|
|
||||||
{
|
|
||||||
uint32_t tiling_config = radeon->info.r600_tiling_config;
|
|
||||||
|
|
||||||
if (!tiling_config)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (radeon->chip_class == R600 || radeon->chip_class == R700) {
|
|
||||||
return r600_interpret_tiling(radeon, tiling_config);
|
|
||||||
} else {
|
|
||||||
return eg_interpret_tiling(radeon, tiling_config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned radeon_family_from_device(unsigned device)
|
static unsigned radeon_family_from_device(unsigned device)
|
||||||
{
|
{
|
||||||
switch (device) {
|
switch (device) {
|
||||||
|
@ -212,16 +103,12 @@ struct radeon *radeon_create(struct radeon_winsys *ws)
|
||||||
case CHIP_RS780:
|
case CHIP_RS780:
|
||||||
case CHIP_RS880:
|
case CHIP_RS880:
|
||||||
radeon->chip_class = R600;
|
radeon->chip_class = R600;
|
||||||
/* set default group bytes, overridden by tiling info ioctl */
|
|
||||||
radeon->tiling_info.group_bytes = 256;
|
|
||||||
break;
|
break;
|
||||||
case CHIP_RV770:
|
case CHIP_RV770:
|
||||||
case CHIP_RV730:
|
case CHIP_RV730:
|
||||||
case CHIP_RV710:
|
case CHIP_RV710:
|
||||||
case CHIP_RV740:
|
case CHIP_RV740:
|
||||||
radeon->chip_class = R700;
|
radeon->chip_class = R700;
|
||||||
/* set default group bytes, overridden by tiling info ioctl */
|
|
||||||
radeon->tiling_info.group_bytes = 256;
|
|
||||||
break;
|
break;
|
||||||
case CHIP_CEDAR:
|
case CHIP_CEDAR:
|
||||||
case CHIP_REDWOOD:
|
case CHIP_REDWOOD:
|
||||||
|
@ -235,13 +122,9 @@ struct radeon *radeon_create(struct radeon_winsys *ws)
|
||||||
case CHIP_TURKS:
|
case CHIP_TURKS:
|
||||||
case CHIP_CAICOS:
|
case CHIP_CAICOS:
|
||||||
radeon->chip_class = EVERGREEN;
|
radeon->chip_class = EVERGREEN;
|
||||||
/* set default group bytes, overridden by tiling info ioctl */
|
|
||||||
radeon->tiling_info.group_bytes = 512;
|
|
||||||
break;
|
break;
|
||||||
case CHIP_CAYMAN:
|
case CHIP_CAYMAN:
|
||||||
radeon->chip_class = CAYMAN;
|
radeon->chip_class = CAYMAN;
|
||||||
/* set default group bytes, overridden by tiling info ioctl */
|
|
||||||
radeon->tiling_info.group_bytes = 512;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "%s unknown or unsupported chipset 0x%04X\n",
|
fprintf(stderr, "%s unknown or unsupported chipset 0x%04X\n",
|
||||||
|
@ -249,9 +132,6 @@ struct radeon *radeon_create(struct radeon_winsys *ws)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radeon_drm_get_tiling(radeon))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return radeon;
|
return radeon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,6 @@ struct radeon {
|
||||||
struct radeon_info info;
|
struct radeon_info info;
|
||||||
unsigned family;
|
unsigned family;
|
||||||
enum chip_class chip_class;
|
enum chip_class chip_class;
|
||||||
struct r600_tiling_info tiling_info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* these flags are used in register flags and added into block flags */
|
/* these flags are used in register flags and added into block flags */
|
||||||
|
|
Loading…
Reference in New Issue