[Mesa-dev] [PATCH 1/2] gallium: add cap to export device pointer size
Ilia Mirkin
imirkin at alum.mit.edu
Sun Aug 28 17:16:25 UTC 2016
Please add documentation for this new cap in
src/gallium/docs/source/screen.rst . What is this supposed to
represent btw? All G80+ GPUs operate in a 40-bit virtual address
space, but pre-fermi there's no ability to get a compute shader to
access more than a 32-bit window at a time (actually 16 such windows,
I believe, effectively getting it to 36-bit). Fermi+ GPUs are,
however, able to operate with both 32- and 64-bit pointers. (I forget
what happens if you use a 32-bit pointer... I think the upper word
might be pre-configured to a fixed value somewhere.)
On Sun, Aug 28, 2016 at 1:12 PM, Jan Vesely <jan.vesely at rutgers.edu> wrote:
> Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
> ---
> src/gallium/drivers/ilo/ilo_screen.c | 6 ++++++
> src/gallium/drivers/nouveau/nv50/nv50_screen.c | 2 ++
> src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 2 ++
> src/gallium/drivers/radeon/r600_pipe_common.c | 8 ++++++++
> src/gallium/drivers/softpipe/sp_screen.c | 1 +
> src/gallium/include/pipe/p_defines.h | 1 +
> 6 files changed, 20 insertions(+)
>
> diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
> index 050c03b..b9e5ad6 100644
> --- a/src/gallium/drivers/ilo/ilo_screen.c
> +++ b/src/gallium/drivers/ilo/ilo_screen.c
> @@ -199,6 +199,7 @@ ilo_get_compute_param(struct pipe_screen *screen,
> uint32_t max_compute_units;
> uint32_t images_supported;
> uint32_t subgroup_size;
> + uint32_t address_bits;
> } val;
> const void *ptr;
> int size;
> @@ -266,6 +267,11 @@ ilo_get_compute_param(struct pipe_screen *screen,
> ptr = &val.max_input_size;
> size = sizeof(val.max_input_size);
> break;
> + case PIPE_COMPUTE_CAP_ADDRESS_BITS:
> + val.address_bits = 32;
> + ptr = &val.address_bits;
> + size = sizeof(val.address_bits);
> + break;
> case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:
> val.max_mem_alloc_size = 1u << 31;
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> index d878547..57c0c2b 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
> @@ -418,6 +418,8 @@ nv50_screen_get_compute_param(struct pipe_screen *pscreen,
> RET((uint32_t []) { screen->mp_count });
> case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
> RET((uint32_t []) { 512 }); /* FIXME: arbitrary limit */
> + case PIPE_COMPUTE_CAP_ADDRESS_BITS:
> + RET((uint32_t []) { 32 });
> default:
> return 0;
> }
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> index f139f66..e7bfbbe 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
> @@ -479,6 +479,8 @@ nvc0_screen_get_compute_param(struct pipe_screen *pscreen,
> RET((uint32_t []) { screen->mp_count_compute });
> case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
> RET((uint32_t []) { 512 }); /* FIXME: arbitrary limit */
> + case PIPE_COMPUTE_CAP_ADDRESS_BITS:
> + RET((uint32_t []) { 64 });
> default:
> return 0;
> }
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
> index b1da22f..1b15594 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
> @@ -881,6 +881,14 @@ static int r600_get_compute_param(struct pipe_screen *screen,
> *max_threads_per_block = 256;
> }
> return sizeof(uint64_t);
> + case PIPE_COMPUTE_CAP_ADDRESS_BITS:
> + if (ret) {
> + uint32_t *address_bits = ret;
> + address_bits[0] = 32;
> + if (rscreen->chip_class >= SI)
> + address_bits[0] = 64;
> + }
> + return 1 * sizeof(uint32_t);
>
> case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
> if (ret) {
> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
> index b742bde..cd4269f 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -521,6 +521,7 @@ softpipe_get_compute_param(struct pipe_screen *_screen,
> case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
> case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
> case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
> + case PIPE_COMPUTE_CAP_ADDRESS_BITS:
> break;
> }
> return 0;
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index 1e4d802..5361ed6 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -834,6 +834,7 @@ enum pipe_shader_ir
> */
> enum pipe_compute_cap
> {
> + PIPE_COMPUTE_CAP_ADDRESS_BITS,
> PIPE_COMPUTE_CAP_IR_TARGET,
> PIPE_COMPUTE_CAP_GRID_DIMENSION,
> PIPE_COMPUTE_CAP_MAX_GRID_SIZE,
> --
> 2.7.4
>
More information about the mesa-dev
mailing list