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