summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers
diff options
context:
space:
mode:
authorJan Vesely <[email protected]>2017-09-01 17:48:39 -0400
committerJan Vesely <[email protected]>2017-09-18 10:45:02 -0400
commitfdf0f1db22d1a85abb38131c6f0757eabcdad80a (patch)
tree600fc84f0704753869262d3c795d234d55eb3fe0 /src/gallium/state_trackers
parent7b2c5547c31360c798db00ef4aa2d2f852363bca (diff)
clover: Query and export half precision support
v2: PIPE_CAP_HALFS -> PIPE_SHADER_CAP_FP16 has_halfs -> has_halves Signed-off-by: Jan Vesely <[email protected]> Reviewed-by: Francisco Jerez <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r--src/gallium/state_trackers/clover/api/device.cpp14
-rw-r--r--src/gallium/state_trackers/clover/core/device.cpp6
-rw-r--r--src/gallium/state_trackers/clover/core/device.hpp1
3 files changed, 18 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/clover/api/device.cpp b/src/gallium/state_trackers/clover/api/device.cpp
index b202102389f..26e88aadc73 100644
--- a/src/gallium/state_trackers/clover/api/device.cpp
+++ b/src/gallium/state_trackers/clover/api/device.cpp
@@ -150,7 +150,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
break;
case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF:
- buf.as_scalar<cl_uint>() = 0;
+ buf.as_scalar<cl_uint>() = dev.has_halves() ? 8 : 0;
break;
case CL_DEVICE_MAX_CLOCK_FREQUENCY:
@@ -213,6 +213,13 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
buf.as_scalar<cl_uint>() = 128;
break;
+ case CL_DEVICE_HALF_FP_CONFIG:
+ // This is the "mandated minimum half precision floating-point
+ // capability" for OpenCL 1.x.
+ buf.as_scalar<cl_device_fp_config>() =
+ CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST;
+ break;
+
case CL_DEVICE_SINGLE_FP_CONFIG:
// This is the "mandated minimum single precision floating-point
// capability" for OpenCL 1.1. In OpenCL 1.2, nothing is required for
@@ -329,7 +336,8 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
" cl_khr_local_int32_base_atomics"
" cl_khr_local_int32_extended_atomics"
" cl_khr_byte_addressable_store"
- + std::string(dev.has_doubles() ? " cl_khr_fp64" : "");
+ + std::string(dev.has_doubles() ? " cl_khr_fp64" : "")
+ + std::string(dev.has_halves() ? " cl_khr_fp16" : "");
break;
case CL_DEVICE_PLATFORM:
@@ -365,7 +373,7 @@ clGetDeviceInfo(cl_device_id d_dev, cl_device_info param,
break;
case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF:
- buf.as_scalar<cl_uint>() = 0;
+ buf.as_scalar<cl_uint>() = dev.has_halves() ? 8 : 0;
break;
case CL_DEVICE_OPENCL_C_VERSION:
diff --git a/src/gallium/state_trackers/clover/core/device.cpp b/src/gallium/state_trackers/clover/core/device.cpp
index fc74bd51a9e..c0ee0acaaf9 100644
--- a/src/gallium/state_trackers/clover/core/device.cpp
+++ b/src/gallium/state_trackers/clover/core/device.cpp
@@ -191,6 +191,12 @@ device::has_doubles() const {
}
bool
+device::has_halves() const {
+ return pipe->get_shader_param(pipe, PIPE_SHADER_COMPUTE,
+ PIPE_SHADER_CAP_FP16);
+}
+
+bool
device::has_unified_memory() const {
return pipe->get_param(pipe, PIPE_CAP_UMA);
}
diff --git a/src/gallium/state_trackers/clover/core/device.hpp b/src/gallium/state_trackers/clover/core/device.hpp
index 4e11519421a..c61be790a94 100644
--- a/src/gallium/state_trackers/clover/core/device.hpp
+++ b/src/gallium/state_trackers/clover/core/device.hpp
@@ -67,6 +67,7 @@ namespace clover {
cl_uint max_compute_units() const;
bool image_support() const;
bool has_doubles() const;
+ bool has_halves() const;
bool has_unified_memory() const;
cl_uint mem_base_addr_align() const;