Because the sizeof struct surface state change in BDW, remove 
gen6_surface_state, and
use gen_surface_state as the unoin of gen7_surface_state and gen8_surface_state.
Use gen_surface_state in surface_heap_t.
Reloc the Dynamic State Base and Instruction Address in 
intel_gpgpu_set_base_address_gen8.
BDW use 48 bits GPU address, so when reloc address, remember that kernel will 
reloc 64 bits in
command batch, so make sure there are 64 bits address, the high 64bits follow 
by low 32bits in command batch.

Signed-off-by: Yang Rong <rong.r.y...@intel.com>
---
 src/intel/.intel_gpgpu.c.swp | Bin 0 -> 81920 bytes
 src/intel/intel_defines.h    |   1 +
 src/intel/intel_gpgpu.c      | 186 +++++++++++++++++++++----------------------
 src/intel/intel_structs.h    |  78 ++----------------
 4 files changed, 97 insertions(+), 168 deletions(-)
 create mode 100644 src/intel/.intel_gpgpu.c.swp

diff --git a/src/intel/.intel_gpgpu.c.swp b/src/intel/.intel_gpgpu.c.swp
new file mode 100644
index 
0000000000000000000000000000000000000000..61a705e3f41582fd9cf855655fe391dea4be8617
GIT binary patch
literal 81920
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
TM~MXsUQ45yf$)2|lC}JQDEuA8

literal 0
HcmV?d00001

diff --git a/src/intel/intel_defines.h b/src/intel/intel_defines.h
index 02ffde4..b424233 100644
--- a/src/intel/intel_defines.h
+++ b/src/intel/intel_defines.h
@@ -87,6 +87,7 @@
 
 #define PIPELINE_SELECT_3D              0
 #define PIPELINE_SELECT_MEDIA           1
+#define PIPELINE_SELECT_GPGPU           2
 
 #define UF0_CS_REALLOC                  (1 << 13)
 #define UF0_VFE_REALLOC                 (1 << 12)
diff --git a/src/intel/intel_gpgpu.c b/src/intel/intel_gpgpu.c
index eedfe31..6d3c443 100644
--- a/src/intel/intel_gpgpu.c
+++ b/src/intel/intel_gpgpu.c
@@ -58,16 +58,9 @@
 /* Stores both binding tables and surface states */
 typedef struct surface_heap {
   uint32_t binding_table[256];
-  char surface[256][sizeof(gen6_surface_state_t)];
+  char surface[256*sizeof(gen_surface_state_t)];
 } surface_heap_t;
 
-/* Stores both binding tables and surface states */
-typedef struct surface_heap_gen8 {
-  uint32_t binding_table[256];
-  char surface[256][sizeof(gen8_surface_state_t)];
-} surface_heap_gen8_t;
-
-
 typedef struct intel_event {
   drm_intel_bo *buffer;
   drm_intel_bo *ts_buf;
@@ -142,6 +135,14 @@ intel_gpgpu_post_action_t *intel_gpgpu_post_action = NULL;
 typedef uint64_t (intel_gpgpu_read_ts_reg_t)(drm_intel_bufmgr *bufmgr);
 intel_gpgpu_read_ts_reg_t *intel_gpgpu_read_ts_reg = NULL;
 
+
+typedef void (intel_gpgpu_set_base_address_t)(intel_gpgpu_t *gpgpu);
+intel_gpgpu_set_base_address_t *intel_gpgpu_set_base_address = NULL;
+
+typedef void (intel_gpgpu_setup_bti_t)(intel_gpgpu_t *gpgpu, drm_intel_bo 
*buf, uint32_t internal_offset,
+                                       uint32_t size, unsigned char index, 
uint32_t format);
+intel_gpgpu_setup_bti_t *intel_gpgpu_setup_bti = NULL;
+
 static void
 intel_gpgpu_sync(void *buf)
 {
@@ -234,7 +235,7 @@ intel_gpgpu_get_cache_ctrl_gen8()
 }
 
 static void
-intel_gpgpu_set_base_address(intel_gpgpu_t *gpgpu)
+intel_gpgpu_set_base_address_gen7(intel_gpgpu_t *gpgpu)
 {
   const uint32_t def_cc = cl_gpgpu_get_cache_ctrl(); /* default Cache Control 
value */
   BEGIN_BATCH(gpgpu->batch, 10);
@@ -272,6 +273,58 @@ intel_gpgpu_set_base_address(intel_gpgpu_t *gpgpu)
   ADVANCE_BATCH(gpgpu->batch);
 }
 
+static void
+intel_gpgpu_set_base_address_gen8(intel_gpgpu_t *gpgpu)
+{
+    const uint32_t def_cc = cl_gpgpu_get_cache_ctrl(); /* default Cache 
Control value */
+    BEGIN_BATCH(gpgpu->batch, 16);
+    OUT_BATCH(gpgpu->batch, CMD_STATE_BASE_ADDRESS | 14);
+    /* 0, Gen State Mem Obj CC, Stateless Mem Obj CC, Stateless Access Write 
Back */
+    OUT_BATCH(gpgpu->batch, 0 | (def_cc << 4) | (0 << 1)| 
BASE_ADDRESS_MODIFY);    /* General State Base Addr   */
+    OUT_BATCH(gpgpu->batch, 0);
+    OUT_BATCH(gpgpu->batch, 0 | (def_cc << 16));
+    /* 0, State Mem Obj CC */
+    /* We use a state base address for the surface heap since IVB clamp the
+     * binding table pointer at 11 bits. So, we cannot use pointers directly 
while
+     * using the surface heap
+     */
+    assert(gpgpu->aux_offset.surface_heap_offset % 4096 == 0);
+    OUT_RELOC(gpgpu->batch, gpgpu->aux_buf.bo,
+              I915_GEM_DOMAIN_SAMPLER,
+              I915_GEM_DOMAIN_SAMPLER,
+              gpgpu->aux_offset.surface_heap_offset + (0 | (def_cc << 4) | (0 
<< 1)| BASE_ADDRESS_MODIFY));
+    OUT_BATCH(gpgpu->batch, 0);
+    OUT_RELOC(gpgpu->batch, gpgpu->aux_buf.bo,
+              I915_GEM_DOMAIN_RENDER,
+              I915_GEM_DOMAIN_RENDER,
+              (0 | (def_cc << 4) | (0 << 1)| BASE_ADDRESS_MODIFY)); /* Dynamic 
State Base Addr */
+    OUT_BATCH(gpgpu->batch, 0);
+    OUT_BATCH(gpgpu->batch, 0 | (def_cc << 4) | BASE_ADDRESS_MODIFY); /* 
Indirect Obj Base Addr */
+    OUT_BATCH(gpgpu->batch, 0);
+    //OUT_BATCH(gpgpu->batch, 0 | (def_cc << 4) | BASE_ADDRESS_MODIFY); /* 
Instruction Base Addr  */
+    OUT_RELOC(gpgpu->batch, (drm_intel_bo *)gpgpu->ker->bo,
+              I915_GEM_DOMAIN_INSTRUCTION,
+              I915_GEM_DOMAIN_INSTRUCTION,
+              0 + (0 | (def_cc << 4) | (0 << 1)| BASE_ADDRESS_MODIFY));
+    OUT_BATCH(gpgpu->batch, 0);
+    /* If we output an AUB file, we limit the total size to 64MB */
+#if USE_FULSIM
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* General 
State Access Upper Bound */
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* Dynamic 
State Access Upper Bound */
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* Indirect Obj 
Access Upper Bound */
+    OUT_BATCH(gpgpu->batch, 0x04000000 | BASE_ADDRESS_MODIFY); /* Instruction 
Access Upper Bound */
+#else
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+    /* According to mesa i965 driver code, we must set the dynamic state 
access upper bound
+     * to a valid bound value, otherwise, the border color pointer may be 
rejected and you
+     * may get incorrect border color. This is a known hardware bug. */
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+    OUT_BATCH(gpgpu->batch, 0xfffff000 | BASE_ADDRESS_MODIFY);
+#endif /* USE_FULSIM */
+    ADVANCE_BATCH(gpgpu->batch);
+}
+
 uint32_t intel_gpgpu_get_scratch_index_gen7(uint32_t size) {
   return size / 1024 - 1;
 }
@@ -702,86 +755,28 @@ intel_gpgpu_set_buf_reloc_gen7(intel_gpgpu_t *gpgpu, 
int32_t index, dri_bo* obj_
 }
 
 static dri_bo*
-intel_gpgpu_alloc_constant_buffer_gen7(intel_gpgpu_t *gpgpu, uint32_t size, 
uint8_t bti)
+intel_gpgpu_alloc_constant_buffer(intel_gpgpu_t *gpgpu, uint32_t size, uint8_t 
bti)
 {
-  uint32_t s = size - 1;
-  assert(size != 0);
-
-  surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss2 = (gen7_surface_state_t *) heap->surface[bti];
-  memset(ss2, 0, sizeof(gen7_surface_state_t));
-  ss2->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss2->ss0.surface_format = I965_SURFACEFORMAT_R32G32B32A32_UINT;
-  ss2->ss2.width  = s & 0x7f;            /* bits 6:0 of sz */
-  ss2->ss2.height = (s >> 7) & 0x3fff;   /* bits 20:7 of sz */
-  ss2->ss3.depth  = (s >> 21) & 0x3ff;   /* bits 30:21 of sz */
-  ss2->ss5.cache_control = cl_gpgpu_get_cache_ctrl();
-  heap->binding_table[bti] = offsetof(surface_heap_t, surface) + bti* 
sizeof(gen7_surface_state_t);
-
   if(gpgpu->constant_b.bo)
     dri_bo_unreference(gpgpu->constant_b.bo);
-  gpgpu->constant_b.bo = drm_intel_bo_alloc(gpgpu->drv->bufmgr, 
"CONSTANT_BUFFER", s, 64);
+  gpgpu->constant_b.bo = drm_intel_bo_alloc(gpgpu->drv->bufmgr, 
"CONSTANT_BUFFER", size, 64);
   if (gpgpu->constant_b.bo == NULL)
     return NULL;
-  ss2->ss1.base_addr = gpgpu->constant_b.bo->offset;
-  dri_bo_emit_reloc(gpgpu->aux_buf.bo,
-                      I915_GEM_DOMAIN_RENDER,
-                      I915_GEM_DOMAIN_RENDER,
-                      0,
-                      gpgpu->aux_offset.surface_heap_offset +
-                      heap->binding_table[bti] +
-                      offsetof(gen7_surface_state_t, ss1),
-                      gpgpu->constant_b.bo);
-  return gpgpu->constant_b.bo;
-}
-
-static dri_bo*
-intel_gpgpu_alloc_constant_buffer_gen75(intel_gpgpu_t *gpgpu, uint32_t size, 
uint8_t bti)
-{
-  uint32_t s = size - 1;
-  assert(size != 0);
-
-  surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss2 = (gen7_surface_state_t *) heap->surface[bti];
-  memset(ss2, 0, sizeof(gen7_surface_state_t));
-  ss2->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss2->ss0.surface_format = I965_SURFACEFORMAT_R32G32B32A32_UINT;
-  ss2->ss2.width  = s & 0x7f;            /* bits 6:0 of sz */
-  ss2->ss2.height = (s >> 7) & 0x3fff;   /* bits 20:7 of sz */
-  ss2->ss3.depth  = (s >> 21) & 0x3ff;   /* bits 30:21 of sz */
-  ss2->ss5.cache_control = cl_gpgpu_get_cache_ctrl();
-  ss2->ss7.shader_r = I965_SURCHAN_SELECT_RED;
-  ss2->ss7.shader_g = I965_SURCHAN_SELECT_GREEN;
-  ss2->ss7.shader_b = I965_SURCHAN_SELECT_BLUE;
-  ss2->ss7.shader_a = I965_SURCHAN_SELECT_ALPHA;
-  heap->binding_table[bti] = offsetof(surface_heap_t, surface) + bti* 
sizeof(gen7_surface_state_t);
 
-  if(gpgpu->constant_b.bo)
-    dri_bo_unreference(gpgpu->constant_b.bo);
-  gpgpu->constant_b.bo = drm_intel_bo_alloc(gpgpu->drv->bufmgr, 
"CONSTANT_BUFFER", s, 64);
-  if (gpgpu->constant_b.bo == NULL)
-    return NULL;
-  ss2->ss1.base_addr = gpgpu->constant_b.bo->offset;
-  dri_bo_emit_reloc(gpgpu->aux_buf.bo,
-                      I915_GEM_DOMAIN_RENDER,
-                      I915_GEM_DOMAIN_RENDER,
-                      0,
-                      gpgpu->aux_offset.surface_heap_offset +
-                      heap->binding_table[bti] +
-                      offsetof(gen7_surface_state_t, ss1),
-                      gpgpu->constant_b.bo);
+  intel_gpgpu_setup_bti(gpgpu, gpgpu->constant_b.bo, 0, size, bti, 
I965_SURFACEFORMAT_R32G32B32A32_UINT);
   return gpgpu->constant_b.bo;
 }
 
 static void
-intel_gpgpu_setup_bti(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t 
internal_offset, uint32_t size, unsigned char index)
+intel_gpgpu_setup_bti_gen7(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t 
internal_offset,
+                                   uint32_t size, unsigned char index, 
uint32_t format)
 {
   uint32_t s = size - 1;
   surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss0 = (gen7_surface_state_t *) heap->surface[index];
+  gen7_surface_state_t *ss0 = (gen7_surface_state_t *) &heap->surface[index * 
sizeof(gen7_surface_state_t)];
   memset(ss0, 0, sizeof(gen7_surface_state_t));
   ss0->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss0->ss0.surface_format = I965_SURFACEFORMAT_RAW;
+  ss0->ss0.surface_format = format;
   ss0->ss2.width  = s & 0x7f;   /* bits 6:0 of sz */
   ss0->ss2.height = (s >> 7) & 0x3fff; /* bits 20:7 of sz */
   ss0->ss3.depth  = (s >> 21) & 0x3ff; /* bits 30:21 of sz */
@@ -800,15 +795,15 @@ intel_gpgpu_setup_bti(intel_gpgpu_t *gpgpu, drm_intel_bo 
*buf, uint32_t internal
 }
 
 static void
-intel_gpgpu_setup_bti_gen8(intel_gpgpu_t *gpgpu, drm_intel_bo *buf,
-                           uint32_t internal_offset, uint32_t size, unsigned 
char index)
+intel_gpgpu_setup_bti_gen8(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t 
internal_offset,
+                                   uint32_t size, unsigned char index, 
uint32_t format)
 {
   uint32_t s = size - 1;
-  surface_heap_gen8_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
-  gen8_surface_state_t *ss0 = (gen8_surface_state_t *) heap->surface[index];
+  surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
+  gen8_surface_state_t *ss0 = (gen8_surface_state_t *) &heap->surface[index * 
sizeof(gen8_surface_state_t)];
   memset(ss0, 0, sizeof(gen8_surface_state_t));
   ss0->ss0.surface_type = I965_SURFACE_BUFFER;
-  ss0->ss0.surface_format = I965_SURFACEFORMAT_RAW;
+  ss0->ss0.surface_format = format;
   ss0->ss2.width  = s & 0x7f;   /* bits 6:0 of sz */
   assert(ss0->ss2.width & 0x03);
   ss0->ss2.height = (s >> 7) & 0x3fff; /* bits 20:7 of sz */
@@ -889,7 +884,7 @@ intel_gpgpu_bind_image_gen7(intel_gpgpu_t *gpgpu,
                               int32_t tiling)
 {
   surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss = (gen7_surface_state_t *) heap->surface[index];
+  gen7_surface_state_t *ss = (gen7_surface_state_t *) &heap->surface[index * 
sizeof(gen7_surface_state_t)];
 
   memset(ss, 0, sizeof(*ss));
   ss->ss0.vertical_line_stride = 0; // always choose VALIGN_2
@@ -935,7 +930,7 @@ intel_gpgpu_bind_image_gen75(intel_gpgpu_t *gpgpu,
                               int32_t tiling)
 {
   surface_heap_t *heap = gpgpu->aux_buf.bo->virtual + 
gpgpu->aux_offset.surface_heap_offset;
-  gen7_surface_state_t *ss = (gen7_surface_state_t *) heap->surface[index];
+  gen7_surface_state_t *ss = (gen7_surface_state_t *) &heap->surface[index * 
sizeof(gen7_surface_state_t)];
   memset(ss, 0, sizeof(*ss));
   ss->ss0.vertical_line_stride = 0; // always choose VALIGN_2
   ss->ss0.surface_type = get_surface_type(gpgpu, index, type);
@@ -978,19 +973,7 @@ intel_gpgpu_bind_buf(intel_gpgpu_t *gpgpu, drm_intel_bo 
*buf, uint32_t offset,
   gpgpu->target_buf_offset[gpgpu->binded_n] = internal_offset;
   gpgpu->binded_offset[gpgpu->binded_n] = offset;
   gpgpu->binded_n++;
-  intel_gpgpu_setup_bti(gpgpu, buf, internal_offset, size, bti);
-}
-
-static void
-intel_gpgpu_bind_buf_gen8(intel_gpgpu_t *gpgpu, drm_intel_bo *buf, uint32_t 
offset,
-                          uint32_t internal_offset, uint32_t size, uint8_t bti)
-{
-  assert(gpgpu->binded_n < max_buf_n);
-  gpgpu->binded_buf[gpgpu->binded_n] = buf;
-  gpgpu->target_buf_offset[gpgpu->binded_n] = internal_offset;
-  gpgpu->binded_offset[gpgpu->binded_n] = offset;
-  gpgpu->binded_n++;
-  intel_gpgpu_setup_bti_gen8(gpgpu, buf, internal_offset, size, bti);
+  intel_gpgpu_setup_bti(gpgpu, buf, internal_offset, size, bti, 
I965_SURFACEFORMAT_RAW);
 }
 
 static int
@@ -1514,6 +1497,7 @@ intel_set_gpgpu_callbacks(int device_id)
   cl_gpgpu_state_init = (cl_gpgpu_state_init_cb *) intel_gpgpu_state_init;
   cl_gpgpu_set_perf_counters = (cl_gpgpu_set_perf_counters_cb *) 
intel_gpgpu_set_perf_counters;
   cl_gpgpu_upload_curbes = (cl_gpgpu_upload_curbes_cb *) 
intel_gpgpu_upload_curbes;
+  cl_gpgpu_alloc_constant_buffer  = (cl_gpgpu_alloc_constant_buffer_cb *) 
intel_gpgpu_alloc_constant_buffer;
   cl_gpgpu_states_setup = (cl_gpgpu_states_setup_cb *) 
intel_gpgpu_states_setup;
   cl_gpgpu_upload_samplers = (cl_gpgpu_upload_samplers_cb *) 
intel_gpgpu_upload_samplers;
   cl_gpgpu_batch_reset = (cl_gpgpu_batch_reset_cb *) intel_gpgpu_batch_reset;
@@ -1539,23 +1523,29 @@ intel_set_gpgpu_callbacks(int device_id)
   cl_gpgpu_get_printf_info = (cl_gpgpu_get_printf_info_cb 
*)intel_gpgpu_get_printf_info;
 
   if (IS_BROADWELL(device_id)) {
-    cl_gpgpu_bind_buf = (cl_gpgpu_bind_buf_cb *)intel_gpgpu_bind_buf_gen8;
+    intel_gpgpu_setup_bti = intel_gpgpu_setup_bti_gen8;
+    cl_gpgpu_bind_image = (cl_gpgpu_bind_image_cb *) 
intel_gpgpu_bind_image_gen75;
+    intel_gpgpu_set_L3 = intel_gpgpu_set_L3_gen75;
     cl_gpgpu_get_cache_ctrl = (cl_gpgpu_get_cache_ctrl_cb 
*)intel_gpgpu_get_cache_ctrl_gen8;
+    intel_gpgpu_get_scratch_index = intel_gpgpu_get_scratch_index_gen75;
+    intel_gpgpu_post_action = intel_gpgpu_post_action_gen75;
+    intel_gpgpu_read_ts_reg = intel_gpgpu_read_ts_reg_gen7; //HSW same as ivb
+    intel_gpgpu_set_base_address = intel_gpgpu_set_base_address_gen8;
     return;
   }
 
   if (IS_HASWELL(device_id)) {
     cl_gpgpu_bind_image = (cl_gpgpu_bind_image_cb *) 
intel_gpgpu_bind_image_gen75;
-    cl_gpgpu_alloc_constant_buffer  = (cl_gpgpu_alloc_constant_buffer_cb *) 
intel_gpgpu_alloc_constant_buffer_gen75;
     intel_gpgpu_set_L3 = intel_gpgpu_set_L3_gen75;
     cl_gpgpu_get_cache_ctrl = (cl_gpgpu_get_cache_ctrl_cb 
*)intel_gpgpu_get_cache_ctrl_gen75;
     intel_gpgpu_get_scratch_index = intel_gpgpu_get_scratch_index_gen75;
     intel_gpgpu_post_action = intel_gpgpu_post_action_gen75;
     intel_gpgpu_read_ts_reg = intel_gpgpu_read_ts_reg_gen7; //HSW same as ivb
+    intel_gpgpu_set_base_address = intel_gpgpu_set_base_address_gen7;
+    intel_gpgpu_setup_bti = intel_gpgpu_setup_bti_gen7;
   }
   else if (IS_IVYBRIDGE(device_id)) {
     cl_gpgpu_bind_image = (cl_gpgpu_bind_image_cb *) 
intel_gpgpu_bind_image_gen7;
-    cl_gpgpu_alloc_constant_buffer  = (cl_gpgpu_alloc_constant_buffer_cb *) 
intel_gpgpu_alloc_constant_buffer_gen7;
     if (IS_BAYTRAIL_T(device_id)) {
       intel_gpgpu_set_L3 = intel_gpgpu_set_L3_baytrail;
       intel_gpgpu_read_ts_reg = intel_gpgpu_read_ts_reg_baytrail;
@@ -1566,5 +1556,7 @@ intel_set_gpgpu_callbacks(int device_id)
     cl_gpgpu_get_cache_ctrl = (cl_gpgpu_get_cache_ctrl_cb 
*)intel_gpgpu_get_cache_ctrl_gen7;
     intel_gpgpu_get_scratch_index = intel_gpgpu_get_scratch_index_gen7;
     intel_gpgpu_post_action = intel_gpgpu_post_action_gen7;
+    intel_gpgpu_set_base_address = intel_gpgpu_set_base_address_gen7;
+    intel_gpgpu_setup_bti = intel_gpgpu_setup_bti_gen7;
   }
 }
diff --git a/src/intel/intel_structs.h b/src/intel/intel_structs.h
index 415df8d..2d8bc54 100644
--- a/src/intel/intel_structs.h
+++ b/src/intel/intel_structs.h
@@ -98,75 +98,6 @@ typedef struct gen6_interface_descriptor
   uint32_t desc7; /* unused */
 } gen6_interface_descriptor_t;
 
-typedef struct gen6_surface_state
-{
-  struct {
-    uint32_t cube_pos_z:1;
-    uint32_t cube_neg_z:1;
-    uint32_t cube_pos_y:1;
-    uint32_t cube_neg_y:1;
-    uint32_t cube_pos_x:1;
-    uint32_t cube_neg_x:1;
-    uint32_t pad:2;
-    uint32_t render_cache_read_mode:1;
-    uint32_t cube_map_corner_mode:1;
-    uint32_t mipmap_layout_mode:1;
-    uint32_t vert_line_stride_ofs:1;
-    uint32_t vert_line_stride:1;
-    uint32_t color_blend:1;
-    uint32_t writedisable_blue:1;
-    uint32_t writedisable_green:1;
-    uint32_t writedisable_red:1;
-    uint32_t writedisable_alpha:1;
-    uint32_t surface_format:9;
-    uint32_t data_return_format:1;
-    uint32_t pad0:1;
-    uint32_t surface_type:3;
-  } ss0;
-
-  struct {
-    uint32_t base_addr;
-  } ss1;
-
-  struct {
-    uint32_t render_target_rotation:2;
-    uint32_t mip_count:4;
-    uint32_t width:13;
-    uint32_t height:13;
-  } ss2;
-
-  struct {
-    uint32_t tile_walk:1;
-    uint32_t tiled_surface:1;
-    uint32_t pad:1;
-    uint32_t pitch:18;
-    uint32_t depth:11;
-  } ss3;
-
-  struct {
-    uint32_t multisample_pos_index:3;
-    uint32_t pad:1;
-    uint32_t multisample_count:3;
-    uint32_t pad1:1;
-    uint32_t rt_view_extent:9;
-    uint32_t min_array_elt:11;
-    uint32_t min_lod:4;
-  } ss4;
-
-  struct {
-    uint32_t pad:16;
-    uint32_t cache_control:2;  /* different values for GT and IVB */
-    uint32_t gfdt:1;           /* allows selective flushing of LLC (e.g. for 
scanout) */
-    uint32_t encrypted_data:1;
-    uint32_t y_offset:4;
-    uint32_t vertical_alignment:1;
-    uint32_t x_offset:7;
-  } ss5;
-
-  uint32_t ss6; /* unused */
-  uint32_t ss7; /* unused */
-} gen6_surface_state_t;
-
 typedef struct gen7_surface_state
 {
   struct {
@@ -407,8 +338,13 @@ typedef struct gen8_surface_state
   } ss15;
 } gen8_surface_state_t;
 
-STATIC_ASSERT(sizeof(gen6_surface_state_t) == sizeof(gen7_surface_state_t));
-static const size_t surface_state_sz = sizeof(gen6_surface_state_t);
+typedef union gen_surface_state
+{
+  gen7_surface_state_t gen7_surface_state;
+  gen8_surface_state_t gen8_surface_state;
+} gen_surface_state_t;
+
+static const size_t surface_state_sz = sizeof(gen_surface_state_t);
 
 typedef struct gen6_vfe_state_inline
 {
-- 
1.8.3.2

_______________________________________________
Beignet mailing list
Beignet@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to