From: Chia-I Wu Date: Sat, 8 Mar 2014 18:07:18 +0000 (+0800) Subject: ilo: winsys may limit the batch buffer size X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=42c1ce4c03c0c5f4fb61b981143cf2638d87c834;p=mesa.git ilo: winsys may limit the batch buffer size The maximum batch buffer size is determined at the time of drm_intel_bufmgr_gem_init(). Make sure the pipe driver does not exceed the limit. --- diff --git a/src/gallium/drivers/ilo/ilo_common.h b/src/gallium/drivers/ilo/ilo_common.h index cc17f76e243..ae7896efc27 100644 --- a/src/gallium/drivers/ilo/ilo_common.h +++ b/src/gallium/drivers/ilo/ilo_common.h @@ -68,6 +68,7 @@ enum ilo_debug { struct ilo_dev_info { /* these mirror intel_winsys_info */ int devid; + int max_batch_size; bool has_llc; bool has_gen7_sol_reset; bool has_address_swizzling; diff --git a/src/gallium/drivers/ilo/ilo_context.c b/src/gallium/drivers/ilo/ilo_context.c index faf29c22778..a01934c9154 100644 --- a/src/gallium/drivers/ilo/ilo_context.c +++ b/src/gallium/drivers/ilo/ilo_context.c @@ -120,6 +120,7 @@ ilo_context_create(struct pipe_screen *screen, void *priv) { struct ilo_screen *is = ilo_screen(screen); struct ilo_context *ilo; + int cp_size; ilo = CALLOC_STRUCT(ilo_context); if (!ilo) @@ -135,7 +136,12 @@ ilo_context_create(struct pipe_screen *screen, void *priv) util_slab_create(&ilo->transfer_mempool, sizeof(struct ilo_transfer), 64, UTIL_SLAB_SINGLETHREADED); - ilo->cp = ilo_cp_create(ilo->winsys, is->dev.has_llc); + /* 8192 DWords */ + cp_size = 8192; + if (cp_size * 4 > is->dev.max_batch_size) + cp_size = is->dev.max_batch_size / 4; + + ilo->cp = ilo_cp_create(ilo->winsys, cp_size, is->dev.has_llc); ilo->shader_cache = ilo_shader_cache_create(); if (ilo->cp) ilo->hw3d = ilo_3d_create(ilo->cp, ilo->dev); diff --git a/src/gallium/drivers/ilo/ilo_cp.c b/src/gallium/drivers/ilo/ilo_cp.c index 8bcb19625f8..cd94eec0fe5 100644 --- a/src/gallium/drivers/ilo/ilo_cp.c +++ b/src/gallium/drivers/ilo/ilo_cp.c @@ -272,7 +272,7 @@ ilo_cp_destroy(struct ilo_cp *cp) * Create a command parser. */ struct ilo_cp * -ilo_cp_create(struct intel_winsys *winsys, bool direct_map) +ilo_cp_create(struct intel_winsys *winsys, int size, bool direct_map) { struct ilo_cp *cp; @@ -286,7 +286,7 @@ ilo_cp_create(struct intel_winsys *winsys, bool direct_map) cp->ring = ILO_CP_RING_RENDER; cp->no_implicit_flush = false; - cp->bo_size = 8192; + cp->bo_size = size; if (!direct_map) { cp->sys = MALLOC(cp->bo_size * 4); diff --git a/src/gallium/drivers/ilo/ilo_cp.h b/src/gallium/drivers/ilo/ilo_cp.h index 9a09ac9106a..1dcfab81cdf 100644 --- a/src/gallium/drivers/ilo/ilo_cp.h +++ b/src/gallium/drivers/ilo/ilo_cp.h @@ -85,7 +85,7 @@ struct ilo_cp_jmp_buf { }; struct ilo_cp * -ilo_cp_create(struct intel_winsys *winsys, bool direct_map); +ilo_cp_create(struct intel_winsys *winsys, int size, bool direct_map); void ilo_cp_destroy(struct ilo_cp *cp); diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c index 55bbb3abaf0..11a5be2ebf1 100644 --- a/src/gallium/drivers/ilo/ilo_screen.c +++ b/src/gallium/drivers/ilo/ilo_screen.c @@ -648,6 +648,7 @@ static bool init_dev(struct ilo_dev_info *dev, const struct intel_winsys_info *info) { dev->devid = info->devid; + dev->max_batch_size = info->max_batch_size; dev->has_llc = info->has_llc; dev->has_gen7_sol_reset = info->has_gen7_sol_reset; dev->has_address_swizzling = info->has_address_swizzling; diff --git a/src/gallium/winsys/intel/drm/intel_drm_winsys.c b/src/gallium/winsys/intel/drm/intel_drm_winsys.c index bd805fdb786..5cdf39fe32e 100644 --- a/src/gallium/winsys/intel/drm/intel_drm_winsys.c +++ b/src/gallium/winsys/intel/drm/intel_drm_winsys.c @@ -135,6 +135,8 @@ init_info(struct intel_winsys *winsys) info->devid = drm_intel_bufmgr_gem_get_devid(winsys->bufmgr); + info->max_batch_size = BATCH_SZ; + get_param(winsys, I915_PARAM_HAS_LLC, &val); info->has_llc = val; diff --git a/src/gallium/winsys/intel/intel_winsys.h b/src/gallium/winsys/intel/intel_winsys.h index 15f1aec1093..b5995fbb40f 100644 --- a/src/gallium/winsys/intel/intel_winsys.h +++ b/src/gallium/winsys/intel/intel_winsys.h @@ -70,6 +70,7 @@ struct intel_bo; struct intel_winsys_info { int devid; + int max_batch_size; bool has_llc; bool has_gen7_sol_reset; bool has_address_swizzling;