ilo: winsys may limit the batch buffer size
authorChia-I Wu <olvaffe@gmail.com>
Sat, 8 Mar 2014 18:07:18 +0000 (02:07 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Mon, 10 Mar 2014 08:42:42 +0000 (16:42 +0800)
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.

src/gallium/drivers/ilo/ilo_common.h
src/gallium/drivers/ilo/ilo_context.c
src/gallium/drivers/ilo/ilo_cp.c
src/gallium/drivers/ilo/ilo_cp.h
src/gallium/drivers/ilo/ilo_screen.c
src/gallium/winsys/intel/drm/intel_drm_winsys.c
src/gallium/winsys/intel/intel_winsys.h

index cc17f76e24356eca1e1f47fcc72a11981e96c590..ae7896efc27a7301b7a2f1a29ed61773b93d07cc 100644 (file)
@@ -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;
index faf29c22778435d42b5315072ce569aba72023e9..a01934c9154c691c1dad88939edbc8e54bbb17cb 100644 (file)
@@ -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);
index 8bcb19625f8676450c35d9f0d2fb916cbfb97be9..cd94eec0fe52c32ba89a8be9af09d83581ad655c 100644 (file)
@@ -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);
index 9a09ac9106a4d0b54d842171656f8d0ff62dea1a..1dcfab81cdf35dd5f4300124c186f21933a34f58 100644 (file)
@@ -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);
index 55bbb3abaf0aff3d4bf27ccd1fbe938f6d8d7dac..11a5be2ebf1e11b243a41657e6f17eece7a596a3 100644 (file)
@@ -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;
index bd805fdb78657dcd83ce3e172ee66ee13cd89af0..5cdf39fe32e3090f6cd4f3202aeaa2ddb45fb33d 100644 (file)
@@ -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;
 
index 15f1aec1093532d523b6f95339581e1dee80fdbd..b5995fbb40ff856fde41439d7ee188f370abb6f3 100644 (file)
@@ -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;