From a434ac045eb2e0333ee8bb6e44aa0a46de2e7438 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sun, 9 Mar 2014 02:00:46 +0800 Subject: [PATCH] ilo: PIPE_CAP_QUERY_TIMESTAMP may not be supported Reading TIMESTAMP register may fail, depending on both kernel and hardware. --- src/gallium/drivers/ilo/ilo_common.h | 1 + src/gallium/drivers/ilo/ilo_screen.c | 4 +++- src/gallium/winsys/intel/drm/intel_drm_winsys.c | 11 +++++++++++ src/gallium/winsys/intel/intel_winsys.h | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) 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 @@ -99,6 +99,14 @@ test_address_swizzling(struct intel_winsys *winsys) return (swizzle != I915_BIT_6_SWIZZLE_NONE); } +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) { @@ -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 * -- 2.30.2