ilo: add ilo_dev_info shared by the screen and contexts
authorChia-I Wu <olvaffe@gmail.com>
Mon, 29 Apr 2013 01:41:11 +0000 (09:41 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 1 May 2013 03:20:41 +0000 (11:20 +0800)
The struct is used to describe the device information, such as PCI ID, GEN,
GT, and etc.

src/gallium/drivers/ilo/ilo_3d.c
src/gallium/drivers/ilo/ilo_common.h
src/gallium/drivers/ilo/ilo_context.c
src/gallium/drivers/ilo/ilo_context.h
src/gallium/drivers/ilo/ilo_format.c
src/gallium/drivers/ilo/ilo_resource.c
src/gallium/drivers/ilo/ilo_screen.c
src/gallium/drivers/ilo/ilo_screen.h
src/gallium/drivers/ilo/ilo_shader.c

index 8d917c06b713d43e8c932c061134cbca57adfc70..52a47de5bd9fe5406b406892448a16777501515e 100644 (file)
@@ -497,7 +497,7 @@ ilo_texture_barrier(struct pipe_context *pipe)
    ilo_3d_pipeline_emit_flush(hw3d->pipeline);
 
    /* don't know why */
-   if (ilo->gen >= ILO_GEN(7))
+   if (ilo->dev->gen >= ILO_GEN(7))
       ilo_cp_flush(hw3d->cp);
 }
 
index 7e6932ac12c479d4311328974cdf05d2e7f83845..d86b10b06c8b08574cfb9d91ee48fcf3b47d5a0f 100644 (file)
@@ -54,6 +54,16 @@ enum ilo_debug {
    ILO_DEBUG_NOCACHE   = 1 << 9,
 };
 
+struct ilo_dev_info {
+   /* these mirror intel_winsys_info */
+   int devid;
+   bool has_llc;
+   bool has_gen7_sol_reset;
+
+   int gen;
+   int gt;
+};
+
 extern int ilo_debug;
 
 /**
index 880c9c1a7ba6657e4f523efb1f051c9519fd5e67..0e9dbf98c7a0770ff8c487963e77e9c4f2f2716b 100644 (file)
@@ -135,32 +135,19 @@ ilo_context_create(struct pipe_screen *screen, void *priv)
       return NULL;
 
    ilo->winsys = is->winsys;
-   ilo->devid = is->devid;
-   ilo->gen = is->gen;
-
-   if (IS_SNB_GT1(ilo->devid) ||
-       IS_IVB_GT1(ilo->devid) ||
-       IS_HSW_GT1(ilo->devid) ||
-       IS_BAYTRAIL(ilo->devid))
-      ilo->gt = 1;
-   else if (IS_SNB_GT2(ilo->devid) ||
-            IS_IVB_GT2(ilo->devid) ||
-            IS_HSW_GT2(ilo->devid))
-      ilo->gt = 2;
-   else
-      ilo->gt = 0;
+   ilo->dev = &is->dev;
 
    /* stolen from classic i965 */
    /* WM maximum threads is number of EUs times number of threads per EU. */
-   if (ilo->gen >= ILO_GEN(7)) {
-      if (ilo->gt == 1) {
+   if (ilo->dev->gen >= ILO_GEN(7)) {
+      if (ilo->dev->gt == 1) {
         ilo->max_wm_threads = 48;
         ilo->max_vs_threads = 36;
         ilo->max_gs_threads = 36;
         ilo->urb.size = 128;
         ilo->urb.max_vs_entries = 512;
         ilo->urb.max_gs_entries = 192;
-      } else if (ilo->gt == 2) {
+      } else if (ilo->dev->gt == 2) {
         ilo->max_wm_threads = 172;
         ilo->max_vs_threads = 128;
         ilo->max_gs_threads = 128;
@@ -170,8 +157,8 @@ ilo_context_create(struct pipe_screen *screen, void *priv)
       } else {
         assert(!"Unknown gen7 device.");
       }
-   } else if (ilo->gen == ILO_GEN(6)) {
-      if (ilo->gt == 2) {
+   } else if (ilo->dev->gen == ILO_GEN(6)) {
+      if (ilo->dev->gt == 2) {
         ilo->max_wm_threads = 80;
         ilo->max_vs_threads = 60;
         ilo->max_gs_threads = 60;
@@ -188,10 +175,10 @@ ilo_context_create(struct pipe_screen *screen, void *priv)
       }
    }
 
-   ilo->cp = ilo_cp_create(ilo->winsys, is->has_llc);
+   ilo->cp = ilo_cp_create(ilo->winsys, is->dev.has_llc);
    ilo->shader_cache = ilo_shader_cache_create(ilo->winsys);
    if (ilo->cp)
-      ilo->hw3d = ilo_3d_create(ilo->cp, ilo->gen, ilo->gt);
+      ilo->hw3d = ilo_3d_create(ilo->cp, ilo->dev->gen, ilo->dev->gt);
 
    if (!ilo->cp || !ilo->shader_cache || !ilo->hw3d) {
       ilo_context_destroy(&ilo->base);
index 695f6f4d29a84a1a69636c0239972c42ad886950..8396fef0364627f94461e7fae88632d02d302efd 100644 (file)
@@ -71,9 +71,7 @@ struct ilo_context {
    struct pipe_context base;
 
    struct intel_winsys *winsys;
-   int devid;
-   int gen;
-   int gt;
+   struct ilo_dev_info *dev;
 
    int max_vs_threads;
    int max_gs_threads;
index 7937eee9a17a9a4fe3cecafa5dcc5a217a230b56..2c63086a52b9c1bdbf97c7b212f206af403e21e4 100644 (file)
@@ -542,7 +542,7 @@ ilo_is_format_supported(struct pipe_screen *screen,
                         unsigned bindings)
 {
    struct ilo_screen *is = ilo_screen(screen);
-   const int gen = ILO_GEN_GET_MAJOR(is->gen * 10);
+   const int gen = ILO_GEN_GET_MAJOR(is->dev.gen * 10);
    const struct surface_format_info *info;
    unsigned bind;
 
index f325c41945d8cc6bbb1fdcbfd0175889dc9ccc85..fd6e858a258722c4a49f13c4c2cc971604e0c1a0 100644 (file)
@@ -323,7 +323,7 @@ map_resource(struct ilo_context *ilo, struct ilo_resource *res,
 
    /* prefer map() when there is the last-level cache */
    if (res->tiling == INTEL_TILING_NONE &&
-       (is->has_llc || (usage & PIPE_TRANSFER_READ)))
+       (is->dev.has_llc || (usage & PIPE_TRANSFER_READ)))
       err = res->bo->map(res->bo, (usage & PIPE_TRANSFER_WRITE));
    else
       err = res->bo->map_gtt(res->bo);
@@ -559,7 +559,7 @@ layout_tex_init(const struct ilo_resource *res, struct layout_tex_info *info)
       info->align_j = info->block_height;
    }
    else if (util_format_is_depth_or_stencil(templ->format)) {
-      if (is->gen >= ILO_GEN(7)) {
+      if (is->dev.gen >= ILO_GEN(7)) {
          switch (templ->format) {
          case PIPE_FORMAT_Z16_UNORM:
             info->align_i = 8;
@@ -600,7 +600,7 @@ layout_tex_init(const struct ilo_resource *res, struct layout_tex_info *info)
    }
    else {
       const bool valign_4 = (templ->nr_samples > 1) ||
-         (is->gen >= ILO_GEN(7) &&
+         (is->dev.gen >= ILO_GEN(7) &&
           (templ->bind & PIPE_BIND_RENDER_TARGET) &&
           tiling == INTEL_TILING_Y);
 
@@ -704,9 +704,9 @@ layout_tex_init(const struct ilo_resource *res, struct layout_tex_info *info)
           * res->slice_offsets, we do not need to divide QPitch by 4.
           */
          info->qpitch = h0 + h1 +
-            ((is->gen >= ILO_GEN(7)) ? 12 : 11) * info->align_j;
+            ((is->dev.gen >= ILO_GEN(7)) ? 12 : 11) * info->align_j;
 
-         if (is->gen == ILO_GEN(6) && templ->nr_samples > 1 &&
+         if (is->dev.gen == ILO_GEN(6) && templ->nr_samples > 1 &&
                templ->height0 % 4 == 1)
             info->qpitch += 4;
       }
index 3b082549d8dac3c11052a6b2f5a161694789c5b4..c74efda1bc798a436f3071db5c5d9ab574891076 100644 (file)
@@ -325,7 +325,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_SM3:
       return true;
    case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
-      if (is->gen >= ILO_GEN(7))
+      if (is->dev.gen >= ILO_GEN(7))
          return 0; /* TODO */
       return ILO_MAX_SO_BUFFERS;
    case PIPE_CAP_PRIMITIVE_RESTART:
@@ -336,7 +336,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_INDEP_BLEND_FUNC:
       return true;
    case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
-      return (is->gen >= ILO_GEN(7)) ? 2048 : 512;
+      return (is->dev.gen >= ILO_GEN(7)) ? 2048 : 512;
    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
@@ -432,7 +432,7 @@ ilo_get_name(struct pipe_screen *screen)
    const char *chipset;
 
    /* stolen from classic i965 */
-   switch (is->devid) {
+   switch (is->dev.devid) {
    case PCI_CHIP_SANDYBRIDGE_GT1:
    case PCI_CHIP_SANDYBRIDGE_GT2:
    case PCI_CHIP_SANDYBRIDGE_GT2_PLUS:
@@ -619,6 +619,45 @@ ilo_screen_destroy(struct pipe_screen *screen)
    FREE(is);
 }
 
+static bool
+init_dev(struct ilo_dev_info *dev, const struct intel_winsys_info *info)
+{
+   dev->devid = info->devid;
+   dev->has_gen7_sol_reset = info->has_gen7_sol_reset;
+   dev->has_llc = info->has_llc;
+
+   if (IS_HASWELL(info->devid)) {
+      dev->gen = ILO_GEN(7.5);
+
+      if (IS_HSW_GT2(info->devid))
+         dev->gt = 2;
+      else
+         dev->gt = 1;
+   }
+   else if (IS_GEN7(info->devid)) {
+      dev->gen = ILO_GEN(7);
+
+      if (IS_IVB_GT2(info->devid))
+         dev->gt = 2;
+      else
+         dev->gt = 1;
+   }
+   else if (IS_GEN6(info->devid)) {
+      dev->gen = ILO_GEN(6);
+
+      if (IS_SNB_GT2(info->devid))
+         dev->gt = 2;
+      else
+         dev->gt = 1;
+   }
+   else {
+      ilo_err("unknown GPU generation\n");
+      return false;
+   }
+
+   return true;
+}
+
 struct pipe_screen *
 ilo_screen_create(struct intel_winsys *ws)
 {
@@ -634,22 +673,11 @@ ilo_screen_create(struct intel_winsys *ws)
    is->winsys = ws;
 
    info = is->winsys->get_info(is->winsys);
-
-   is->devid = info->devid;
-   if (IS_GEN7(info->devid)) {
-      is->gen = ILO_GEN(7);
-   }
-   else if (IS_GEN6(info->devid)) {
-      is->gen = ILO_GEN(6);
-   }
-   else {
-      ilo_err("unknown GPU generation\n");
+   if (!init_dev(&is->dev, info)) {
       FREE(is);
       return NULL;
    }
 
-   is->has_llc = info->has_llc;
-
    util_format_s3tc_init();
 
    is->base.destroy = ilo_screen_destroy;
index 7883f185bde7d18c2bdb61dc0a769f7aa4258d6b..4c403f042f2d1e8be215d604869553f2dfbb4034 100644 (file)
@@ -45,10 +45,7 @@ struct ilo_screen {
    struct pipe_screen base;
 
    struct intel_winsys *winsys;
-   int devid;
-   int gen;
-
-   bool has_llc;
+   struct ilo_dev_info dev;
 };
 
 static inline struct ilo_screen *
index d81ac3592f4f2ca3e65ff270580e6544d9ac6f00..907934483816ca6b2e567eef82ab5d22ea0aadfe 100644 (file)
@@ -328,7 +328,7 @@ ilo_shader_state_create(const struct ilo_context *ilo,
       return NULL;
 
    state->info.type = type;
-   state->info.gen = ilo->gen;
+   state->info.gen = ilo->dev->gen;
 
    if (type == PIPE_SHADER_COMPUTE) {
       const struct pipe_compute_state *c =