|
|
@@ -100,6 +100,12 @@ static boolean r600_query_sw_begin(struct r600_common_context *rctx, |
|
|
|
case R600_QUERY_NUM_SHADERS_CREATED: |
|
|
|
query->begin_result = p_atomic_read(&rctx->screen->num_shaders_created); |
|
|
|
break; |
|
|
|
case R600_QUERY_GPIN_ASIC_ID: |
|
|
|
case R600_QUERY_GPIN_NUM_SIMD: |
|
|
|
case R600_QUERY_GPIN_NUM_RB: |
|
|
|
case R600_QUERY_GPIN_NUM_SPI: |
|
|
|
case R600_QUERY_GPIN_NUM_SE: |
|
|
|
break; |
|
|
|
default: |
|
|
|
unreachable("r600_query_sw_begin: bad query type"); |
|
|
|
} |
|
|
@@ -146,6 +152,12 @@ static void r600_query_sw_end(struct r600_common_context *rctx, |
|
|
|
case R600_QUERY_NUM_SHADERS_CREATED: |
|
|
|
query->end_result = p_atomic_read(&rctx->screen->num_shaders_created); |
|
|
|
break; |
|
|
|
case R600_QUERY_GPIN_ASIC_ID: |
|
|
|
case R600_QUERY_GPIN_NUM_SIMD: |
|
|
|
case R600_QUERY_GPIN_NUM_RB: |
|
|
|
case R600_QUERY_GPIN_NUM_SPI: |
|
|
|
case R600_QUERY_GPIN_NUM_SE: |
|
|
|
break; |
|
|
|
default: |
|
|
|
unreachable("r600_query_sw_end: bad query type"); |
|
|
|
} |
|
|
@@ -171,6 +183,22 @@ static boolean r600_query_sw_get_result(struct r600_common_context *rctx, |
|
|
|
wait ? PIPE_TIMEOUT_INFINITE : 0); |
|
|
|
return result->b; |
|
|
|
} |
|
|
|
|
|
|
|
case R600_QUERY_GPIN_ASIC_ID: |
|
|
|
result->u32 = 0; |
|
|
|
return TRUE; |
|
|
|
case R600_QUERY_GPIN_NUM_SIMD: |
|
|
|
result->u32 = rctx->screen->info.num_good_compute_units; |
|
|
|
return TRUE; |
|
|
|
case R600_QUERY_GPIN_NUM_RB: |
|
|
|
result->u32 = rctx->screen->info.r600_num_backends; |
|
|
|
return TRUE; |
|
|
|
case R600_QUERY_GPIN_NUM_SPI: |
|
|
|
result->u32 = 1; /* all supported chips have one SPI per SE */ |
|
|
|
return TRUE; |
|
|
|
case R600_QUERY_GPIN_NUM_SE: |
|
|
|
result->u32 = rctx->screen->info.max_se; |
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
|
|
|
|
result->u64 = query->end_result - query->begin_result; |
|
|
@@ -1096,15 +1124,21 @@ err: |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
#define X(name_, query_type_, type_, result_type_) \ |
|
|
|
#define XFULL(name_, query_type_, type_, result_type_, group_id_) \ |
|
|
|
{ \ |
|
|
|
.name = name_, \ |
|
|
|
.query_type = R600_QUERY_##query_type_, \ |
|
|
|
.type = PIPE_DRIVER_QUERY_TYPE_##type_, \ |
|
|
|
.result_type = PIPE_DRIVER_QUERY_RESULT_TYPE_##result_type_, \ |
|
|
|
.group_id = ~(unsigned)0 \ |
|
|
|
.group_id = group_id_ \ |
|
|
|
} |
|
|
|
|
|
|
|
#define X(name_, query_type_, type_, result_type_) \ |
|
|
|
XFULL(name_, query_type_, type_, result_type_, ~(unsigned)0) |
|
|
|
|
|
|
|
#define XG(group_, name_, query_type_, type_, result_type_) \ |
|
|
|
XFULL(name_, query_type_, type_, result_type_, R600_QUERY_GROUP_##group_) |
|
|
|
|
|
|
|
static struct pipe_driver_query_info r600_driver_query_list[] = { |
|
|
|
X("num-compilations", NUM_COMPILATIONS, UINT64, CUMULATIVE), |
|
|
|
X("num-shaders-created", NUM_SHADERS_CREATED, UINT64, CUMULATIVE), |
|
|
@@ -1116,6 +1150,20 @@ static struct pipe_driver_query_info r600_driver_query_list[] = { |
|
|
|
X("num-bytes-moved", NUM_BYTES_MOVED, BYTES, CUMULATIVE), |
|
|
|
X("VRAM-usage", VRAM_USAGE, BYTES, AVERAGE), |
|
|
|
X("GTT-usage", GTT_USAGE, BYTES, AVERAGE), |
|
|
|
|
|
|
|
/* GPIN queries are for the benefit of old versions of GPUPerfStudio, |
|
|
|
* which use it as a fallback path to detect the GPU type. |
|
|
|
* |
|
|
|
* Note: The names of these queries are significant for GPUPerfStudio |
|
|
|
* (and possibly their order as well). */ |
|
|
|
XG(GPIN, "GPIN_000", GPIN_ASIC_ID, UINT, AVERAGE), |
|
|
|
XG(GPIN, "GPIN_001", GPIN_NUM_SIMD, UINT, AVERAGE), |
|
|
|
XG(GPIN, "GPIN_002", GPIN_NUM_RB, UINT, AVERAGE), |
|
|
|
XG(GPIN, "GPIN_003", GPIN_NUM_SPI, UINT, AVERAGE), |
|
|
|
XG(GPIN, "GPIN_004", GPIN_NUM_SE, UINT, AVERAGE), |
|
|
|
|
|
|
|
/* The following queries must be at the end of the list because their |
|
|
|
* availability is adjusted dynamically based on the DRM version. */ |
|
|
|
X("GPU-load", GPU_LOAD, UINT64, AVERAGE), |
|
|
|
X("temperature", GPU_TEMPERATURE, UINT64, AVERAGE), |
|
|
|
X("shader-clock", CURRENT_GPU_SCLK, HZ, AVERAGE), |
|
|
@@ -1123,6 +1171,8 @@ static struct pipe_driver_query_info r600_driver_query_list[] = { |
|
|
|
}; |
|
|
|
|
|
|
|
#undef X |
|
|
|
#undef XG |
|
|
|
#undef XFULL |
|
|
|
|
|
|
|
static unsigned r600_get_num_queries(struct r600_common_screen *rscreen) |
|
|
|
{ |
|
|
@@ -1167,16 +1217,40 @@ static int r600_get_driver_query_info(struct pipe_screen *screen, |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (info->group_id != ~(unsigned)0 && rscreen->perfcounters) |
|
|
|
info->group_id += rscreen->perfcounters->num_groups; |
|
|
|
|
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
/* Note: Unfortunately, GPUPerfStudio hardcodes the order of hardware |
|
|
|
* performance counter groups, so be careful when changing this and related |
|
|
|
* functions. |
|
|
|
*/ |
|
|
|
static int r600_get_driver_query_group_info(struct pipe_screen *screen, |
|
|
|
unsigned index, |
|
|
|
struct pipe_driver_query_group_info *info) |
|
|
|
{ |
|
|
|
struct r600_common_screen *rscreen = (struct r600_common_screen *)screen; |
|
|
|
unsigned num_pc_groups = 0; |
|
|
|
|
|
|
|
return r600_get_perfcounter_group_info(rscreen, index, info); |
|
|
|
if (rscreen->perfcounters) |
|
|
|
num_pc_groups = rscreen->perfcounters->num_groups; |
|
|
|
|
|
|
|
if (!info) |
|
|
|
return num_pc_groups + R600_NUM_SW_QUERY_GROUPS; |
|
|
|
|
|
|
|
if (index < num_pc_groups) |
|
|
|
return r600_get_perfcounter_group_info(rscreen, index, info); |
|
|
|
|
|
|
|
index -= num_pc_groups; |
|
|
|
if (index >= R600_NUM_SW_QUERY_GROUPS) |
|
|
|
return 0; |
|
|
|
|
|
|
|
info->name = "GPIN"; |
|
|
|
info->max_active_queries = 5; |
|
|
|
info->num_queries = 5; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
void r600_query_init(struct r600_common_context *rctx) |