}
static int
+zink_get_compute_param(struct pipe_screen *pscreen, enum pipe_shader_ir ir_type,
+ enum pipe_compute_cap param, void *ret)
+{
+ struct zink_screen *screen = zink_screen(pscreen);
+#define RET(x) do { \
+ if (ret) \
+ memcpy(ret, x, sizeof(x)); \
+ return sizeof(x); \
+} while (0)
+
+ switch (param) {
+ case PIPE_COMPUTE_CAP_ADDRESS_BITS:
+ RET((uint32_t []){ 32 });
+
+ case PIPE_COMPUTE_CAP_IR_TARGET:
+ if (ret)
+ strcpy(ret, "nir");
+ return 4;
+
+ case PIPE_COMPUTE_CAP_GRID_DIMENSION:
+ RET((uint64_t []) { 3 });
+
+ case PIPE_COMPUTE_CAP_MAX_GRID_SIZE:
+ RET(((uint64_t []) { screen->info.props.limits.maxComputeWorkGroupCount[0],
+ screen->info.props.limits.maxComputeWorkGroupCount[1],
+ screen->info.props.limits.maxComputeWorkGroupCount[2] }));
+
+ case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE:
+ /* MaxComputeWorkGroupSize[0..2] */
+ RET(((uint64_t []) {screen->info.props.limits.maxComputeWorkGroupSize[0],
+ screen->info.props.limits.maxComputeWorkGroupSize[1],
+ screen->info.props.limits.maxComputeWorkGroupSize[2]}));
+
+ case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK:
+ case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK:
+ RET((uint64_t []) { screen->info.props.limits.maxComputeWorkGroupInvocations });
+
+ case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE:
+ RET((uint64_t []) { screen->info.props.limits.maxComputeSharedMemorySize });
+
+ case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED:
+ RET((uint32_t []) { 1 });
+
+ case PIPE_COMPUTE_CAP_SUBGROUP_SIZE:
+ RET((uint32_t []) { screen->info.props11.subgroupSize });
+
+ case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE:
+ case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY:
+ case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS:
+ case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE:
+ case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
+ case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE:
+ // XXX: I think these are for Clover...
+ return 0;
+
+ default:
+ unreachable("unknown compute param");
+ }
+}
+
+static int
zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
{
struct zink_screen *screen = zink_screen(pscreen);
return INT_MAX;
break;
+ case PIPE_SHADER_COMPUTE:
+ return INT_MAX;
default:
break;
}
screen->base.get_name = zink_get_name;
screen->base.get_vendor = zink_get_vendor;
screen->base.get_device_vendor = zink_get_device_vendor;
+ screen->base.get_compute_param = zink_get_compute_param;
screen->base.get_param = zink_get_param;
screen->base.get_paramf = zink_get_paramf;
screen->base.get_shader_param = zink_get_shader_param;