aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2014-03-09 02:00:46 +0800
committerChia-I Wu <[email protected]>2014-03-10 16:42:42 +0800
commita434ac045eb2e0333ee8bb6e44aa0a46de2e7438 (patch)
treeb7af34b87ea3eec4a5ffcf0a375078084306c6bc
parent249b1ad98440fee5174aa490e7c3269b88de8904 (diff)
ilo: PIPE_CAP_QUERY_TIMESTAMP may not be supported
Reading TIMESTAMP register may fail, depending on both kernel and hardware.
-rw-r--r--src/gallium/drivers/ilo/ilo_common.h1
-rw-r--r--src/gallium/drivers/ilo/ilo_screen.c4
-rw-r--r--src/gallium/winsys/intel/drm/intel_drm_winsys.c11
-rw-r--r--src/gallium/winsys/intel/intel_winsys.h4
4 files changed, 19 insertions, 1 deletions
diff --git a/src/gallium/drivers/ilo/ilo_common.h b/src/gallium/drivers/ilo/ilo_common.h
index 9145d3235bd..cc17f76e243 100644
--- a/src/gallium/drivers/ilo/ilo_common.h
+++ b/src/gallium/drivers/ilo/ilo_common.h
@@ -71,6 +71,7 @@ struct ilo_dev_info {
bool has_llc;
bool has_gen7_sol_reset;
bool has_address_swizzling;
+ bool has_timestamp;
int gen;
int gt;
diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
index 5d1243d1da3..55bbb3abaf0 100644
--- a/src/gallium/drivers/ilo/ilo_screen.c
+++ b/src/gallium/drivers/ilo/ilo_screen.c
@@ -404,8 +404,9 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
/* imposed by OWord (Dual) Block Read */
return 16;
case PIPE_CAP_START_INSTANCE:
- case PIPE_CAP_QUERY_TIMESTAMP:
return true;
+ case PIPE_CAP_QUERY_TIMESTAMP:
+ return is->dev.has_timestamp;
case PIPE_CAP_TEXTURE_MULTISAMPLE:
return false; /* TODO */
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
@@ -650,6 +651,7 @@ init_dev(struct ilo_dev_info *dev, const struct intel_winsys_info *info)
dev->has_llc = info->has_llc;
dev->has_gen7_sol_reset = info->has_gen7_sol_reset;
dev->has_address_swizzling = info->has_address_swizzling;
+ dev->has_timestamp = info->has_timestamp;
/*
* From the Sandy Bridge PRM, volume 4 part 2, page 18:
diff --git a/src/gallium/winsys/intel/drm/intel_drm_winsys.c b/src/gallium/winsys/intel/drm/intel_drm_winsys.c
index 12ed2e43355..bd805fdb786 100644
--- a/src/gallium/winsys/intel/drm/intel_drm_winsys.c
+++ b/src/gallium/winsys/intel/drm/intel_drm_winsys.c
@@ -100,6 +100,14 @@ test_address_swizzling(struct intel_winsys *winsys)
}
static bool
+test_reg_read(struct intel_winsys *winsys, uint32_t reg)
+{
+ uint64_t dummy;
+
+ return !drm_intel_reg_read(winsys->bufmgr, reg, &dummy);
+}
+
+static bool
init_info(struct intel_winsys *winsys)
{
struct intel_winsys_info *info = &winsys->info;
@@ -130,6 +138,9 @@ init_info(struct intel_winsys *winsys)
get_param(winsys, I915_PARAM_HAS_LLC, &val);
info->has_llc = val;
+ /* test TIMESTAMP read */
+ info->has_timestamp = test_reg_read(winsys, 0x2358);
+
get_param(winsys, I915_PARAM_HAS_GEN7_SOL_RESET, &val);
info->has_gen7_sol_reset = val;
diff --git a/src/gallium/winsys/intel/intel_winsys.h b/src/gallium/winsys/intel/intel_winsys.h
index e84c9600c35..15f1aec1093 100644
--- a/src/gallium/winsys/intel/intel_winsys.h
+++ b/src/gallium/winsys/intel/intel_winsys.h
@@ -69,9 +69,13 @@ struct intel_bo;
struct intel_winsys_info {
int devid;
+
bool has_llc;
bool has_gen7_sol_reset;
bool has_address_swizzling;
+
+ /* valid registers for intel_winsys_read_reg() */
+ bool has_timestamp;
};
struct intel_winsys *