#ifndef _I965_STRUCTS_H_
#define _I965_STRUCTS_H_

struct i965_vfe_state 
{
    struct {
	unsigned int per_thread_scratch_space:4;
	unsigned int pad3:3;
	unsigned int extend_vfe_state_present:1;
	unsigned int pad2:2;
	unsigned int scratch_base:22;
    } vfe0;

    struct {
	unsigned int debug_counter_control:2;
	unsigned int children_present:1;
	unsigned int vfe_mode:4;
	unsigned int pad2:2;
	unsigned int num_urb_entries:7;
	unsigned int urb_entry_alloc_size:9;
	unsigned int max_threads:7;
    } vfe1;

    struct {
	unsigned int pad4:4;
	unsigned int interface_descriptor_base:28;
    } vfe2;
};

struct i965_vfe_state_ex 
{
    struct {
	unsigned int pad:8;
	unsigned int obj_id:24;
    } vfex0;

    union {
        struct {
            unsigned int residual_grf_offset:5;
            unsigned int pad0:3;
            unsigned int weight_grf_offset:5;
            unsigned int pad1:3;
            unsigned int residual_data_offset:8;
            unsigned int sub_field_present_flag:2;
            unsigned int residual_data_fix_offset_flag:1;
            unsigned int pad2:5;
        } avc;
        
        unsigned int vc1;
    } vfex1;

    struct {
	unsigned int remap_index_0:4;
	unsigned int remap_index_1:4;
	unsigned int remap_index_2:4;
	unsigned int remap_index_3:4;
	unsigned int remap_index_4:4;
	unsigned int remap_index_5:4;
	unsigned int remap_index_6:4;
	unsigned int remap_index_7:4;
    }remap_table0;

    struct {
	unsigned int remap_index_8:4;
	unsigned int remap_index_9:4;
	unsigned int remap_index_10:4;
	unsigned int remap_index_11:4;
	unsigned int remap_index_12:4;
	unsigned int remap_index_13:4;
	unsigned int remap_index_14:4;
	unsigned int remap_index_15:4;
    } remap_table1;

    struct {
	unsigned int mask:8;
	unsigned int pad:22;
	unsigned int type:1;
	unsigned int enable:1;
    } scoreboard0;

    struct {
        int delta_x0:4;
        int delta_y0:4;
        int delta_x1:4;
        int delta_y1:4;
        int delta_x2:4;
        int delta_y2:4;
        int delta_x3:4;
        int delta_y3:4;
    } scoreboard1;

    struct {
        int delta_x4:4;
        int delta_y4:4;
        int delta_x5:4;
        int delta_y5:4;
        int delta_x6:4;
        int delta_y6:4;
        int delta_x7:4;
        int delta_y7:4;
    } scoreboard2;

    unsigned int pad;
};

struct i965_vld_state 
{
    struct {
        unsigned int pad6:6;
        unsigned int scan_order:1;
        unsigned int intra_vlc_format:1;
        unsigned int quantizer_scale_type:1;
        unsigned int concealment_motion_vector:1;
        unsigned int frame_predict_frame_dct:1;
        unsigned int top_field_first:1;
        unsigned int picture_structure:2;
        unsigned int intra_dc_precision:2;
        unsigned int f_code_0_0:4;
        unsigned int f_code_0_1:4;
        unsigned int f_code_1_0:4;
        unsigned int f_code_1_1:4;
    } vld0;

    struct {
        unsigned int pad2:9;
        unsigned int picture_coding_type:2;
        unsigned int pad:21;
    } vld1;

    struct {
        unsigned int index_0:4;
        unsigned int index_1:4;
        unsigned int index_2:4;
        unsigned int index_3:4;
        unsigned int index_4:4;
        unsigned int index_5:4;
        unsigned int index_6:4;
        unsigned int index_7:4;
    } desc_remap_table0;

    struct {
        unsigned int index_8:4;
        unsigned int index_9:4;
        unsigned int index_10:4;
        unsigned int index_11:4;
        unsigned int index_12:4;
        unsigned int index_13:4;
        unsigned int index_14:4;
        unsigned int index_15:4;
    } desc_remap_table1;
};

struct i965_interface_descriptor 
{
    struct {
	unsigned int grf_reg_blocks:4;
	unsigned int pad:2;
	unsigned int kernel_start_pointer:26;
    } desc0;

    struct {
	unsigned int pad:7;
	unsigned int software_exception:1;
	unsigned int pad2:3;
	unsigned int maskstack_exception:1;
	unsigned int pad3:1;
	unsigned int illegal_opcode_exception:1;
	unsigned int pad4:2;
	unsigned int floating_point_mode:1;
	unsigned int thread_priority:1;
	unsigned int single_program_flow:1;
	unsigned int pad5:1;
	unsigned int const_urb_entry_read_offset:6;
	unsigned int const_urb_entry_read_len:6;
    } desc1;

    struct {
	unsigned int pad:2;
	unsigned int sampler_count:3;
	unsigned int sampler_state_pointer:27;
    } desc2;

    struct {
	unsigned int binding_table_entry_count:5;
	unsigned int binding_table_pointer:27;
    } desc3;
};

struct i965_surface_state 
{
    struct {
	unsigned int cube_pos_z:1;
	unsigned int cube_neg_z:1;
	unsigned int cube_pos_y:1;
	unsigned int cube_neg_y:1;
	unsigned int cube_pos_x:1;
	unsigned int cube_neg_x:1;
	unsigned int pad:2;
	unsigned int render_cache_read_mode:1;
	unsigned int cube_map_corner_mode:1;
	unsigned int mipmap_layout_mode:1;
	unsigned int vert_line_stride_ofs:1;
	unsigned int vert_line_stride:1;
	unsigned int color_blend:1;
	unsigned int writedisable_blue:1;
	unsigned int writedisable_green:1;
	unsigned int writedisable_red:1;
	unsigned int writedisable_alpha:1;
	unsigned int surface_format:9;
	unsigned int data_return_format:1;
	unsigned int pad0:1;
	unsigned int surface_type:3;
    } ss0;

    struct {
	unsigned int base_addr;
    } ss1;

    struct {
	unsigned int render_target_rotation:2;
	unsigned int mip_count:4;
	unsigned int width:13;
	unsigned int height:13;
    } ss2;

    struct {
	unsigned int tile_walk:1;
	unsigned int tiled_surface:1;
	unsigned int pad:1;
	unsigned int pitch:18;
	unsigned int depth:11;
    } ss3;

    struct {
	unsigned int pad:19;
	unsigned int min_array_elt:9;
	unsigned int min_lod:4;
    } ss4;

    struct {
	unsigned int pad:20;
	unsigned int y_offset:4;
	unsigned int pad2:1;
	unsigned int x_offset:7;
    } ss5;
};

struct thread0
{
    unsigned int pad0:1;
    unsigned int grf_reg_count:3; 
    unsigned int pad1:2;
    unsigned int kernel_start_pointer:26; 
};

struct thread1
{
    unsigned int ext_halt_exception_enable:1; 
    unsigned int sw_exception_enable:1; 
    unsigned int mask_stack_exception_enable:1; 
    unsigned int timeout_exception_enable:1; 
    unsigned int illegal_op_exception_enable:1; 
    unsigned int pad0:3;
    unsigned int depth_coef_urb_read_offset:6;	/* WM only */
    unsigned int pad1:2;
    unsigned int floating_point_mode:1; 
    unsigned int thread_priority:1; 
    unsigned int binding_table_entry_count:8; 
    unsigned int pad3:5;
    unsigned int single_program_flow:1; 
};

struct thread2
{
    unsigned int per_thread_scratch_space:4; 
    unsigned int pad0:6;
    unsigned int scratch_space_base_pointer:22; 
};

   
struct thread3
{
    unsigned int dispatch_grf_start_reg:4; 
    unsigned int urb_entry_read_offset:6; 
    unsigned int pad0:1;
    unsigned int urb_entry_read_length:6; 
    unsigned int pad1:1;
    unsigned int const_urb_entry_read_offset:6; 
    unsigned int pad2:1;
    unsigned int const_urb_entry_read_length:6; 
    unsigned int pad3:1;
};

struct i965_vs_unit_state
{
    struct thread0 thread0;
    struct thread1 thread1;
    struct thread2 thread2;
    struct thread3 thread3;
   
    struct {
        unsigned int pad0:10;
        unsigned int stats_enable:1; 
        unsigned int nr_urb_entries:7; 
        unsigned int pad1:1;
        unsigned int urb_entry_allocation_size:5; 
        unsigned int pad2:1;
        unsigned int max_threads:4; 
        unsigned int pad3:3;
    } thread4;   

    struct {
        unsigned int sampler_count:3; 
        unsigned int pad0:2;
        unsigned int sampler_state_pointer:27; 
    } vs5;

    struct {
        unsigned int vs_enable:1; 
        unsigned int vert_cache_disable:1; 
        unsigned int pad0:30;
    } vs6;
};

struct i965_gs_unit_state
{
   struct thread0 thread0;
   struct thread1 thread1;
   struct thread2 thread2;
   struct thread3 thread3;

   struct {
      unsigned int pad0:10;
      unsigned int stats_enable:1; 
      unsigned int nr_urb_entries:7; 
      unsigned int pad1:1;
      unsigned int urb_entry_allocation_size:5; 
      unsigned int pad2:1;
      unsigned int max_threads:1; 
      unsigned int pad3:6;
   } thread4;   
      
   struct {
      unsigned int sampler_count:3; 
      unsigned int pad0:2;
      unsigned int sampler_state_pointer:27; 
   } gs5;

   
   struct {
      unsigned int max_vp_index:4; 
      unsigned int pad0:26;
      unsigned int reorder_enable:1; 
      unsigned int pad1:1;
   } gs6;
};

struct i965_clip_unit_state
{
   struct thread0 thread0;
   struct thread1 thread1;
   struct thread2 thread2;
   struct thread3 thread3;

   struct {
      unsigned int pad0:9;
      unsigned int gs_output_stats:1; /* not always */
      unsigned int stats_enable:1; 
      unsigned int nr_urb_entries:7; 
      unsigned int pad1:1;
      unsigned int urb_entry_allocation_size:5; 
      unsigned int pad2:1;
      unsigned int max_threads:6; 	/* may be less */
      unsigned int pad3:1;
   } thread4;   
      
   struct {
      unsigned int pad0:13;
      unsigned int clip_mode:3; 
      unsigned int userclip_enable_flags:8; 
      unsigned int userclip_must_clip:1; 
      unsigned int pad1:1;
      unsigned int guard_band_enable:1; 
      unsigned int viewport_z_clip_enable:1; 
      unsigned int viewport_xy_clip_enable:1; 
      unsigned int vertex_position_space:1; 
      unsigned int api_mode:1; 
      unsigned int pad2:1;
   } clip5;
   
   struct {
      unsigned int pad0:5;
      unsigned int clipper_viewport_state_ptr:27; 
   } clip6;

   
   float viewport_xmin;  
   float viewport_xmax;  
   float viewport_ymin;  
   float viewport_ymax;  
};

struct i965_sf_unit_state
{
   struct thread0 thread0;
   struct {
      unsigned int pad0:7;
      unsigned int sw_exception_enable:1; 
      unsigned int pad1:3;
      unsigned int mask_stack_exception_enable:1; 
      unsigned int pad2:1;
      unsigned int illegal_op_exception_enable:1; 
      unsigned int pad3:2;
      unsigned int floating_point_mode:1; 
      unsigned int thread_priority:1; 
      unsigned int binding_table_entry_count:8; 
      unsigned int pad4:5;
      unsigned int single_program_flow:1; 
   } sf1;
   
   struct thread2 thread2;
   struct thread3 thread3;

   struct {
      unsigned int pad0:10;
      unsigned int stats_enable:1; 
      unsigned int nr_urb_entries:7; 
      unsigned int pad1:1;
      unsigned int urb_entry_allocation_size:5; 
      unsigned int pad2:1;
      unsigned int max_threads:6; 
      unsigned int pad3:1;
   } thread4;   

   struct {
      unsigned int front_winding:1; 
      unsigned int viewport_transform:1; 
      unsigned int pad0:3;
      unsigned int sf_viewport_state_offset:27; 
   } sf5;
   
   struct {
      unsigned int pad0:9;
      unsigned int dest_org_vbias:4; 
      unsigned int dest_org_hbias:4; 
      unsigned int scissor:1; 
      unsigned int disable_2x2_trifilter:1; 
      unsigned int disable_zero_pix_trifilter:1; 
      unsigned int point_rast_rule:2; 
      unsigned int line_endcap_aa_region_width:2; 
      unsigned int line_width:4; 
      unsigned int fast_scissor_disable:1; 
      unsigned int cull_mode:2; 
      unsigned int aa_enable:1; 
   } sf6;

   struct {
      unsigned int point_size:11; 
      unsigned int use_point_size_state:1; 
      unsigned int subpixel_precision:1; 
      unsigned int sprite_point:1; 
      unsigned int pad0:11;
      unsigned int trifan_pv:2; 
      unsigned int linestrip_pv:2; 
      unsigned int tristrip_pv:2; 
      unsigned int line_last_pixel_enable:1; 
   } sf7;
};

struct i965_sampler_state
{
   struct {
      unsigned int shadow_function:3; 
      unsigned int lod_bias:11; 
      unsigned int min_filter:3; 
      unsigned int mag_filter:3; 
      unsigned int mip_filter:2; 
      unsigned int base_level:5; 
      unsigned int pad:1;
      unsigned int lod_preclamp:1; 
      unsigned int border_color_mode:1; 
      unsigned int pad0:1;
      unsigned int disable:1; 
   } ss0;

   struct {
      unsigned int r_wrap_mode:3; 
      unsigned int t_wrap_mode:3; 
      unsigned int s_wrap_mode:3; 
      unsigned int pad:3;
      unsigned int max_lod:10; 
      unsigned int min_lod:10; 
   } ss1;

   
   struct {
      unsigned int pad:5;
      unsigned int border_color_pointer:27; 
   } ss2;
   
   struct {
      unsigned int pad:19;
      unsigned int max_aniso:3; 
      unsigned int chroma_key_mode:1; 
      unsigned int chroma_key_index:2; 
      unsigned int chroma_key_enable:1; 
      unsigned int monochrome_filter_width:3; 
      unsigned int monochrome_filter_height:3; 
   } ss3;
};

struct i965_wm_unit_state
{
   struct thread0 thread0;
   struct thread1 thread1;
   struct thread2 thread2;
   struct thread3 thread3;
   
   struct {
      unsigned int stats_enable:1; 
      unsigned int pad0:1;
      unsigned int sampler_count:3; 
      unsigned int sampler_state_pointer:27; 
   } wm4;
   
   struct {
      unsigned int enable_8_pix:1; 
      unsigned int enable_16_pix:1; 
      unsigned int enable_32_pix:1; 
      unsigned int pad0:7;
      unsigned int legacy_global_depth_bias:1; 
      unsigned int line_stipple:1; 
      unsigned int depth_offset:1; 
      unsigned int polygon_stipple:1; 
      unsigned int line_aa_region_width:2; 
      unsigned int line_endcap_aa_region_width:2; 
      unsigned int early_depth_test:1; 
      unsigned int thread_dispatch_enable:1; 
      unsigned int program_uses_depth:1; 
      unsigned int program_computes_depth:1; 
      unsigned int program_uses_killpixel:1; 
      unsigned int legacy_line_rast: 1; 
      unsigned int transposed_urb_read:1; 
      unsigned int max_threads:7; 
   } wm5;
   
   float global_depth_offset_constant;  
   float global_depth_offset_scale;   
};

struct i965_cc_viewport
{
   float min_depth;  
   float max_depth;  
};

struct i965_cc_unit_state
{
   struct {
      unsigned int pad0:3;
      unsigned int bf_stencil_pass_depth_pass_op:3; 
      unsigned int bf_stencil_pass_depth_fail_op:3; 
      unsigned int bf_stencil_fail_op:3; 
      unsigned int bf_stencil_func:3; 
      unsigned int bf_stencil_enable:1; 
      unsigned int pad1:2;
      unsigned int stencil_write_enable:1; 
      unsigned int stencil_pass_depth_pass_op:3; 
      unsigned int stencil_pass_depth_fail_op:3; 
      unsigned int stencil_fail_op:3; 
      unsigned int stencil_func:3; 
      unsigned int stencil_enable:1; 
   } cc0;

   
   struct {
      unsigned int bf_stencil_ref:8; 
      unsigned int stencil_write_mask:8; 
      unsigned int stencil_test_mask:8; 
      unsigned int stencil_ref:8; 
   } cc1;

   
   struct {
      unsigned int logicop_enable:1; 
      unsigned int pad0:10;
      unsigned int depth_write_enable:1; 
      unsigned int depth_test_function:3; 
      unsigned int depth_test:1; 
      unsigned int bf_stencil_write_mask:8; 
      unsigned int bf_stencil_test_mask:8; 
   } cc2;

   
   struct {
      unsigned int pad0:8;
      unsigned int alpha_test_func:3; 
      unsigned int alpha_test:1; 
      unsigned int blend_enable:1; 
      unsigned int ia_blend_enable:1; 
      unsigned int pad1:1;
      unsigned int alpha_test_format:1;
      unsigned int pad2:16;
   } cc3;
   
   struct {
      unsigned int pad0:5; 
      unsigned int cc_viewport_state_offset:27; 
   } cc4;
   
   struct {
      unsigned int pad0:2;
      unsigned int ia_dest_blend_factor:5; 
      unsigned int ia_src_blend_factor:5; 
      unsigned int ia_blend_function:3; 
      unsigned int statistics_enable:1; 
      unsigned int logicop_func:4; 
      unsigned int pad1:11;
      unsigned int dither_enable:1; 
   } cc5;

   struct {
      unsigned int clamp_post_alpha_blend:1; 
      unsigned int clamp_pre_alpha_blend:1; 
      unsigned int clamp_range:2; 
      unsigned int pad0:11;
      unsigned int y_dither_offset:2; 
      unsigned int x_dither_offset:2; 
      unsigned int dest_blend_factor:5; 
      unsigned int src_blend_factor:5; 
      unsigned int blend_function:3; 
   } cc6;

   struct {
      union {
	 float f;  
	 unsigned char ub[4];
      } alpha_ref;
   } cc7;
};

struct i965_sampler_8x8
{
    struct {
        unsigned int pad0:16;
        unsigned int chroma_key_index:2;
        unsigned int chroma_key_enable:1;
        unsigned int pad1:8;
        unsigned int ief_filter_size:1;
        unsigned int ief_filter_type:1;
        unsigned int ief_bypass:1;
        unsigned int pad2:1;
        unsigned int avs_filter_type:1;
    } dw0;

    struct {
        unsigned int pad0:5;
        unsigned int sampler_8x8_state_pointer:27;
    } dw1;
    
    struct {
        unsigned int weak_edge_threshold:4;
        unsigned int strong_edge_threshold:4;
        unsigned int global_noise_estimation:8;
        unsigned int pad0:16;
    } dw2;

    struct {
        unsigned int r3x_coefficient:5;
        unsigned int pad0:1;
        unsigned int r3c_coefficient:5;
        unsigned int pad1:3;
        unsigned int gain_factor:6;
        unsigned int non_edge_weight:3;
        unsigned int pad2:1;
        unsigned int regular_weight:3;
        unsigned int pad3:1;
        unsigned int strong_edge_weight:3;
        unsigned int pad4:1;
    } dw3;

    struct {
        unsigned int pad0:2;
        unsigned int mr_boost:1;
        unsigned int mr_threshold:4;
        unsigned int steepness_boost:1;
        unsigned int steepness_threshold:4;
        unsigned int pad1:2;
        unsigned int r5x_coefficient:5;
        unsigned int pad2:1;
        unsigned int r5cx_coefficient:5;
        unsigned int pad3:1;
        unsigned int r5c_coefficient:5;
        unsigned int pad4:1;
    } dw4;

    struct {
        unsigned int pwl1_point_1:8;
        unsigned int pwl1_point_2:8;
        unsigned int pwl1_point_3:8;
        unsigned int pwl1_point_4:8;
    } dw5;

    struct {
        unsigned int pwl1_point_5:8;
        unsigned int pwl1_point_6:8;
        unsigned int pwl1_r3_bias_0:8;
        unsigned int pwl1_r3_bias_1:8;
    } dw6;

    struct {
        unsigned int pwl1_r3_bias_2:8;
        unsigned int pwl1_r3_bias_3:8;
        unsigned int pwl1_r3_bias_4:8;
        unsigned int pwl1_r3_bias_5:8;
    } dw7;

    struct {
        unsigned int pwl1_r3_bias_6:8;
        unsigned int pwl1_r5_bias_0:8;
        unsigned int pwl1_r5_bias_1:8;
        unsigned int pwl1_r5_bias_2:8;
    } dw8;

    struct {
        unsigned int pwl1_r5_bias_3:8;
        unsigned int pwl1_r5_bias_4:8;
        unsigned int pwl1_r5_bias_5:8;
        unsigned int pwl1_r5_bias_6:8;
    } dw9;

    struct {
        int pwl1_r3_slope_0:8;
        int pwl1_r3_slope_1:8;
        int pwl1_r3_slope_2:8;
        int pwl1_r3_slope_3:8;
    } dw10;

    struct {
        int pwl1_r3_slope_4:8;
        int pwl1_r3_slope_5:8;
        int pwl1_r3_slope_6:8;
        int pwl1_r5_slope_0:8;
    } dw11;

    struct {
        int pwl1_r5_slope_1:8;
        int pwl1_r5_slope_2:8;
        int pwl1_r5_slope_3:8;
        int pwl1_r5_slope_4:8;
    } dw12;

    struct {
        int pwl1_r5_slope_5:8;
        int pwl1_r5_slope_6:8;
        unsigned int limiter_boost:4;
        unsigned int pad0:4;
        unsigned int minimum_limiter:4;
        unsigned int maximum_limiter:4;
    } dw13;

    struct {
        unsigned int pad0:8;
        unsigned int clip_limiter:10;
        unsigned int pad1:14;
    } dw14;

    unsigned int dw15; /* Just a pad */
};

struct i965_sampler_8x8_coefficient
{
    struct {
        int table_0x_filter_c0:8;
        int table_0x_filter_c1:8;
        int table_0x_filter_c2:8;
        int table_0x_filter_c3:8;
    } dw0;

    struct {
        int table_0x_filter_c4:8;
        int table_0x_filter_c5:8;
        int table_0x_filter_c6:8;
        int table_0x_filter_c7:8;
    } dw1;

    struct {
        int table_0y_filter_c0:8;
        int table_0y_filter_c1:8;
        int table_0y_filter_c2:8;
        int table_0y_filter_c3:8;
    } dw2;

    struct {
        int table_0y_filter_c4:8;
        int table_0y_filter_c5:8;
        int table_0y_filter_c6:8;
        int table_0y_filter_c7:8;
    } dw3;

    struct {
        int table_1x_filter_c0:8;
        int table_1x_filter_c1:8;
        int table_1x_filter_c2:8;
        int table_1x_filter_c3:8;
    } dw4;

    struct {
        int table_1x_filter_c4:8;
        int table_1x_filter_c5:8;
        int table_1x_filter_c6:8;
        int table_1x_filter_c7:8;
    } dw5;

    struct {
        int table_1y_filter_c0:8;
        int table_1y_filter_c1:8;
        int table_1y_filter_c2:8;
        int table_1y_filter_c3:8;
    } dw6;

    struct {
        int table_1y_filter_c4:8;
        int table_1y_filter_c5:8;
        int table_1y_filter_c6:8;
        int table_1y_filter_c7:8;
    } dw7;
};

struct i965_sampler_8x8_state
{
    struct i965_sampler_8x8_coefficient coefficients[17];

    struct {
        unsigned int transition_area_with_8_pixels:3;
        unsigned int pad0:1;
        unsigned int transition_area_with_4_pixels:3;
        unsigned int pad1:1;
        unsigned int max_derivative_8_pixels:8;
        unsigned int max_derivative_4_pixels:8;
        unsigned int default_sharpness_level:8;
    } dw136;

    union {
        /* Ironlake, Sandybridge, Ivybridge (Gen5+) */
        struct {
            unsigned int pad0:21;
            unsigned int bypass_y_adaptive_filtering:1;
            unsigned int bypass_x_adaptive_filtering:1;
            unsigned int pad1:9;
        } ilk;

        /* Haswell (Gen7.5+) */
        struct {
            unsigned int rgb_adaptive:1;
            unsigned int adaptive_filter_for_all_channel:1;
            unsigned int pad0:19;
            unsigned int bypass_y_adaptive_filtering:1;
            unsigned int bypass_x_adaptive_filtering:1;
            unsigned int pad1:9;
        } hsw;
    } dw137;
};

struct i965_surface_state2
{
    struct {
        unsigned int surface_base_address;
    } ss0;

    struct {
        unsigned int cbcr_pixel_offset_v_direction:2;
        unsigned int pad0:4;
        unsigned int width:13;
        unsigned int height:13;
    } ss1;

    struct {
        unsigned int tile_walk:1;
        unsigned int tiled_surface:1;
        unsigned int half_pitch_for_chroma:1;
        unsigned int pitch:17;
        unsigned int pad0:2;
        unsigned int surface_object_control_data:4;
        unsigned int pad1:1;
        unsigned int interleave_chroma:1;
        unsigned int surface_format:4;
    } ss2;

    struct {
        unsigned int y_offset_for_cb:13;
        unsigned int pad0:3;
        unsigned int x_offset_for_cb:13;
        unsigned int pad1:3;
    } ss3;

    struct {
        unsigned int y_offset_for_cr:13;
        unsigned int pad0:3;
        unsigned int x_offset_for_cr:13;
        unsigned int pad1:3;
    } ss4;
};

struct i965_sampler_dndi
{
    struct {
        unsigned int denoise_asd_threshold:8;
        unsigned int denoise_history_delta:8;
        unsigned int denoise_maximum_history:8;
        unsigned int denoise_stad_threshold:8;
    } dw0;

    struct {
        unsigned int denoise_threshold_for_sum_of_complexity_measure:8;
        unsigned int denoise_moving_pixel_threshold:5;
        unsigned int stmm_c2:3;
        unsigned int low_temporal_difference_threshold:6;
        unsigned int pad0:2;
        unsigned int temporal_difference_threshold:6;
        unsigned int pad1:2;
    } dw1;

    struct {
        unsigned int block_noise_estimate_noise_threshold:8;
        unsigned int block_noise_estimate_edge_threshold:8; 
        unsigned int denoise_edge_threshold:8;
        unsigned int good_neighbor_threshold:8;
   } dw2;

    struct {
        unsigned int maximum_stmm:8;
        unsigned int multipler_for_vecm:6;
        unsigned int pad0:2;
        unsigned int blending_constant_across_time_for_small_values_of_stmm:8;
        unsigned int blending_constant_across_time_for_large_values_of_stmm:7;
        unsigned int stmm_blending_constant_select:1;
    } dw3;

    struct {
        unsigned int sdi_delta:8;
        unsigned int sdi_threshold:8;
        unsigned int stmm_output_shift:4;
        unsigned int stmm_shift_up:2;
        unsigned int stmm_shift_down:2;
        unsigned int minimum_stmm:8;
    } dw4;

    struct {
        unsigned int fmd_temporal_difference_threshold:8;
        unsigned int sdi_fallback_mode_2_constant:8;
        unsigned int sdi_fallback_mode_1_t2_constant:8;
        unsigned int sdi_fallback_mode_1_t1_constant:8;
    } dw5;

    struct {
        unsigned int dn_enable:1;
        unsigned int di_enable:1;
        unsigned int di_partial:1;
        unsigned int dndi_top_first:1;
        unsigned int dndi_stream_id:1;
        unsigned int dndi_first_frame:1;
        unsigned int progressive_dn:1;
        unsigned int pad0:1;
        unsigned int fmd_tear_threshold:6;
        unsigned int pad1:2;
        unsigned int fmd2_vertical_difference_threshold:8;
        unsigned int fmd1_vertical_difference_threshold:8;
    } dw6;

    struct {
        unsigned int pad0:8;
        unsigned int fmd_for_1st_field_of_current_frame:2;
        unsigned int pad1:6;
        unsigned int fmd_for_2nd_field_of_previous_frame:2;
        unsigned int vdi_walker_enable:1;
        unsigned int pad2:4;
        unsigned int column_width_minus1:9;
    } dw7;
};

struct gen8_interface_descriptor_data
{
    struct {
        unsigned int pad0:6;
        unsigned int kernel_start_pointer:26;
    } desc0;
    
    struct {
        unsigned int kernel_start_pointer_high:16;
        unsigned int pad0:16;
    } desc1;

    struct {
        unsigned int pad0:7;
        unsigned int software_exception_enable:1;
        unsigned int pad1:3;
        unsigned int maskstack_exception_enable:1;
        unsigned int pad2:1;
        unsigned int illegal_opcode_exception_enable:1;
        unsigned int pad3:2;
        unsigned int floating_point_mode:1;
        unsigned int thread_priority:1;
        unsigned int single_program_flow:1;
        unsigned int denorm_mode:1;
        unsigned int pad4:12;
    } desc2;

    struct {
        unsigned int pad0:2;
        unsigned int sampler_count:3;
        unsigned int sampler_state_pointer:27;
    } desc3;

    struct {
        unsigned int binding_table_entry_count:5;
        unsigned int binding_table_pointer:11;
	unsigned int pad0: 16;
    } desc4;

    struct {
        unsigned int constant_urb_entry_read_offset:16;
        unsigned int constant_urb_entry_read_length:16;
    } desc5;

    struct {
	unsigned int num_threads_in_tg:10;
	unsigned int pad0:5;
	unsigned int global_barrier_enable:1;
	unsigned int shared_local_memory_size:5;
	unsigned int barrier_enable:1;
	unsigned int rounding_mode:2;
	unsigned int pad1:8;
    } desc6;

    struct {
        unsigned int cross_thread_constant_data_read_length:8;
        unsigned int pad0:24;
    } desc7;
};
 
struct gen8_surface_state
{
    struct {
        unsigned int cube_pos_z:1;
        unsigned int cube_neg_z:1;
        unsigned int cube_pos_y:1;
        unsigned int cube_neg_y:1;
        unsigned int cube_pos_x:1;
        unsigned int cube_neg_x:1;
        unsigned int media_boundary_pixel_mode:2;
        unsigned int render_cache_read_write:1;
        unsigned int sampler_l2bypass_disable:1;
        unsigned int vert_line_stride_ofs:1;
        unsigned int vert_line_stride:1;
        unsigned int tile_walk:1;
	unsigned int tiled_surface:1;
        unsigned int horizontal_alignment:2;
	/* Field 16 */
        unsigned int vertical_alignment:2;
        unsigned int surface_format:9;     /**< BRW_SURFACEFORMAT_x */
        unsigned int pad0:1;
        unsigned int is_array:1;
        unsigned int surface_type:3;       /**< BRW_SURFACE_1D/2D/3D/CUBE */
    } ss0;

    struct {
        unsigned int surface_qpitch:15;
	unsigned int pad0:4;
	unsigned int base_mip_level:5;
	unsigned int surface_mocs:7;
	unsigned int pad1:1;
    } ss1;

    struct {
        unsigned int width:14;
        unsigned int pad0:2;
        unsigned int height:14;
        unsigned int pad1:2;
    } ss2;

    struct {
        unsigned int pitch:18;
        unsigned int pad:3;
        unsigned int depth:11;
    } ss3;

    struct {
        unsigned int multisample_position_palette_index:3;
        unsigned int num_multisamples:3;
        unsigned int multisampled_surface_storage_format:1;
        unsigned int render_target_view_extent:11;
        unsigned int min_array_elt:11;
        unsigned int rotation:2;
        unsigned int force_ncmp_reduce_type:1;
    } ss4;

    struct {
        unsigned int mip_count:4;
        unsigned int min_lod:4;
        unsigned int pad0:4;
        unsigned int pad1:2;
	unsigned int coherence_type:1;
	unsigned int pad2:3;
	unsigned int pad3:2;
	unsigned int ewa_disable_cube:1;
	unsigned int y_offset:3;
	unsigned int pad4:1;
	unsigned int x_offset:7;
    } ss5;

    struct {
	unsigned int y_offset_uv_plane:14;
	unsigned int pad0:2;
	unsigned int x_offset_uv_plane:14;
	unsigned int pad1:1;
	unsigned int separate_uv_plane:1;
    } ss6;

    struct {
        unsigned int resource_min_lod:12;
        unsigned int pad0:4;
        unsigned int shader_chanel_select_a:3;
        unsigned int shader_chanel_select_b:3;
        unsigned int shader_chanel_select_g:3;
        unsigned int shader_chanel_select_r:3;
        unsigned int alpha_clear_color:1;
        unsigned int blue_clear_color:1;
        unsigned int green_clear_color:1;
        unsigned int red_clear_color:1;
    } ss7;
    struct {
	unsigned int base_addr;
    } ss8;

    struct {
	unsigned int base_addr_high:16;
	unsigned int pad0:16;
    } ss9;

    struct {
	unsigned int pad0:12;
	unsigned int aux_base_addr:20;
    } ss10;
 
    union {
	struct {
		unsigned int y_offset_v_plane:14;
		unsigned int pad0:2;
		unsigned int x_offset_v_plane:14;
		unsigned int pad1:2;
	} planar;
	struct {
		unsigned int aux_base_addr_high:16;
		unsigned int pad2:16;
	} aux_buffer;
    } ss11; 

    struct {
	unsigned int hier_depth_clear;
    } ss12;

    struct {
	unsigned int pad0;
    } ss13;

    struct {
	unsigned int pad0;
    } ss14;

    struct {
	unsigned int pad0;
    } ss15;  
};

struct gen8_surface_state2
{
    struct {
        unsigned int pad0;
    } ss0;

    struct {
        unsigned int cbcr_pixel_offset_v_direction:2;
        unsigned int picture_structure:2;
        unsigned int width:14;
        unsigned int height:14;
    } ss1;

    struct {
        unsigned int tile_walk:1;
        unsigned int tiled_surface:1;
        unsigned int half_pitch_for_chroma:1;
        unsigned int pitch:18;
        unsigned int address_ctrl:1; /* clamp or mirror mode */
        unsigned int pad0:4;
        unsigned int interleave_chroma:1;
        unsigned int surface_format:5;
    } ss2;

    struct {
        unsigned int y_offset_for_cb:14;
        unsigned int pad0:2;
        unsigned int x_offset_for_cb:14;
        unsigned int pad1:2;
    } ss3;

    struct {
        unsigned int y_offset_for_cr:15;
        unsigned int pad0:1;
        unsigned int x_offset_for_cr:14;
        unsigned int pad1:2;
    } ss4;

    struct {
        unsigned int surface_object_mocs:7;
	unsigned int pad0:11;
	unsigned int pad1:2;
	unsigned int pad2:10;
	unsigned int vert_line_stride_offset:1;
	unsigned int vert_line_stride:1;
    } ss5;

    struct {
        unsigned int base_addr;
    } ss6;

    struct {
        unsigned int base_addr_high:16;
	unsigned int pad0:16;
    } ss7;
};

struct gen9_surface_state2
{
    struct {
        unsigned int pad0:16;
        unsigned int y_offset:4;
        unsigned int x_offset:7;
        unsigned int pad1:3;
        unsigned int rotation:2;
    } ss0;

    struct {
        unsigned int cbcr_pixel_offset_v_direction:2;
        unsigned int picture_structure:2;
        unsigned int width:14;
        unsigned int height:14;
    } ss1;

    struct {
        unsigned int tile_walk:1;
        unsigned int tiled_surface:1;
        unsigned int half_pitch_for_chroma:1;
        unsigned int pitch:18;
        unsigned int address_ctrl:1; /* clamp or mirror mode */
        unsigned int memory_compression_enable:1;
        unsigned int memory_compression_mode:1;
        unsigned int cbcr_pixel_offset_v_direction_msb:1;
        unsigned int cbcr_pixel_offset_u_direction:1;
        unsigned int interleave_chroma:1;
        unsigned int surface_format:5;
    } ss2;

    struct {
        unsigned int y_offset_for_cb:14;
        unsigned int pad0:2;
        unsigned int x_offset_for_cb:14;
        unsigned int pad1:2;
    } ss3;

    struct {
        unsigned int y_offset_for_cr:15;
        unsigned int pad0:1;
        unsigned int x_offset_for_cr:14;
        unsigned int pad1:2;
    } ss4;

    struct {
        unsigned int surface_object_mocs:7;
	unsigned int pad0:11;
	unsigned int tr_mode:2;
	unsigned int pad1:10;
	unsigned int vert_line_stride_offset:1;
	unsigned int vert_line_stride:1;
    } ss5;

    struct {
        unsigned int base_addr;
    } ss6;

    struct {
        unsigned int base_addr_high:16;
	unsigned int pad0:16;
    } ss7;
};

struct gen9_surface_state
{
    struct {
        unsigned int pad0:6;
        unsigned int media_boundary_pixel_mode:2;
        unsigned int render_cache_read_write:1;
        unsigned int sampler_l2bypass_disable:1;
        unsigned int vert_line_stride_ofs:1;
        unsigned int vert_line_stride:1;
        unsigned int tile_walk:1;
        unsigned int tiled_surface:1;
        unsigned int horizontal_alignment:2;
        /* Field 16 */
        unsigned int vertical_alignment:2;
        unsigned int surface_format:9;     /**< BRW_SURFACEFORMAT_x */
        unsigned int astc_enable:1;
        unsigned int is_array:1;
        unsigned int surface_type:3;       /**< BRW_SURFACE_1D/2D/3D/CUBE */
    } ss0;

    struct {
        unsigned int surface_qpitch:15;
        unsigned int pad0:4;
        unsigned int base_mip_level:5;
        unsigned int surface_mocs:7;
        unsigned int pad1:1;
    } ss1;

    struct {
        unsigned int width:14;
        unsigned int pad0:2;
        unsigned int height:14;
        unsigned int pad1:2;
    } ss2;

    struct {
        unsigned int pitch:18;
        unsigned int pad:3;
        unsigned int depth:11;
    } ss3;

    struct {
        unsigned int multisample_position_palette_index:3;
        unsigned int num_multisamples:3;
        unsigned int multisampled_surface_storage_format:1;
        unsigned int render_target_view_extent:11;
        unsigned int min_array_elt:11;
        unsigned int rotation:2;
        unsigned int force_ncmp_reduce_type:1;
    } ss4;

    struct {
        unsigned int mip_count:4;
        unsigned int min_lod:4;
        unsigned int miptail_start_lod:4;
        unsigned int pad0:2;
        unsigned int coherence_type:1;
        unsigned int pad1:3;
        unsigned int tr_mode:2;
        unsigned int ewa_disable_cube:1;
        unsigned int y_offset:3;
        unsigned int pad2:1;
        unsigned int x_offset:7;
    } ss5;

    struct {
        unsigned int y_offset_uv_plane:14;
        unsigned int pad0:2;
        unsigned int x_offset_uv_plane:14;
        unsigned int pad1:1;
        unsigned int separate_uv_plane:1;
    } ss6;

    struct {
        unsigned int resource_min_lod:12;
        unsigned int pad0:4;
        unsigned int shader_chanel_select_a:3;
        unsigned int shader_chanel_select_b:3;
        unsigned int shader_chanel_select_g:3;
        unsigned int shader_chanel_select_r:3;
        unsigned int pad1:2;
        unsigned int memory_compression_enable:1;
        unsigned int memory_compression_mode:1;
    } ss7;

    struct {
        unsigned int base_addr;
    } ss8;

    struct {
        unsigned int base_addr_high;
    } ss9;

    struct {
        unsigned int quilt_width:5;
        unsigned int quilt_height:5;
        unsigned int pad0:6;
        unsigned int pad1:16;
    } ss10;

    struct {
        unsigned int y_offset_v_plane:14;
        unsigned int pad0:2;
        unsigned int x_offset_v_plane:14;
        unsigned int pad1:2;
    } ss11;

    struct {
        unsigned int pad0;
    } ss12;

    struct {
        unsigned int pad0;
    } ss13;

    struct {
        unsigned int pad0;
    } ss14;

    struct {
        unsigned int pad0;
    } ss15;
};

struct gen8_sampler_state
{
   struct
   {
      unsigned int aniso_algorithm:1;
      unsigned int lod_bias:13;
      unsigned int min_filter:3;
      unsigned int mag_filter:3;
      unsigned int mip_filter:2;
      unsigned int base_level:5;
      unsigned int lod_preclamp:2;
      unsigned int default_color_mode:1;
      unsigned int pad0:1;
      unsigned int disable:1;
   } ss0;

   struct
   {
      unsigned int cube_control_mode:1;
      unsigned int shadow_function:3;
      unsigned int chroma_key_mode:1;
      unsigned int chroma_key_index:2;
      unsigned int chroma_key_enable:1;
      unsigned int max_lod:12;
      unsigned int min_lod:12;
   } ss1;

   struct
   {
	unsigned int lod_clamp_mag_mode:1; /* MIPNONE or MIPFILTER */
	unsigned int flex_filter_vert_align:1;
	unsigned int flex_filter_hort_align:1;
	unsigned int flex_filter_coff_size:1; /* coff8 or coff 16 */
	unsigned int flex_filter_mode:1;
	unsigned int pad0:1;
	unsigned int indirect_state_pointer:18; /* point to the SAMPLE_INDIRECT_STATE */
	union {
		unsigned char nonsep_filter_footer_highmask;
		struct {
			unsigned char pad1:2;
			unsigned char sep_filter_height:2;
			unsigned char sep_filter_width:2;
			unsigned char sep_filter_coff_size:2;
		} sep_filter;		
	} ss2_byte3;
   } ss2;

   struct
   {
      unsigned int r_wrap_mode:3;
      unsigned int t_wrap_mode:3;
      unsigned int s_wrap_mode:3;
      unsigned int pad0:1;
      unsigned int non_normalized_coord:1;
      unsigned int trilinear_quality:2;
      unsigned int address_round:6;
      unsigned int max_aniso:3;
	unsigned int pad1:2;
	unsigned int nonsep_filter_foot_lowmask:8; 
   } ss3;
};

struct gen8_global_blend_state
{
    unsigned int pad0:19;
    unsigned int ydither_offset:2;
    unsigned int xdither_offset:2;
    unsigned int color_dither_enable:1;
    unsigned int alpha_test_func:3;
    unsigned int alpha_test_enable:1;
    unsigned int alpha_to_coverage_dither:1;
    unsigned int alpha_to_one:1;
    unsigned int ia_blend_enable:1;
    unsigned int alpha_to_coverage:1;
};

struct gen8_blend_state_rt {
    struct {
        unsigned int blue_write_dis:1;
        unsigned int green_write_dis:1;
        unsigned int red_write_dis:1;
        unsigned int alpha_write_dis:1;
        unsigned int pad0:1;
        unsigned int alpha_blend_func:3;
        unsigned int ia_dest_blend_factor:5;
        unsigned int ia_src_blend_factor:5;
        unsigned int color_blend_func:3;
        unsigned int dest_blend_factor:5;
        unsigned int src_blend_factor:5;
        unsigned int colorbuf_blend:1;
    } blend0;

    struct {
        unsigned int post_blend_clamp_enable:1;
        unsigned int pre_blend_clamp_enable:1;
        unsigned int clamp_range:2;
        unsigned int pre_blend_src_clamp:1;
        unsigned int pad0:22;
        unsigned int logic_op_func:4;
        unsigned int logic_op_enable:1;
    } blend1;
};

/* TODO: Add the sampler_8x8 for Gen8+. 
 * AVS/Convolve is 256DWs.
 * MinMaxfilter/Erode/Dilate: 8DWs*/


struct gen6_blend_state
{
    struct {
        unsigned int dest_blend_factor:5;
        unsigned int source_blend_factor:5;
        unsigned int pad3:1;
        unsigned int blend_func:3;
        unsigned int pad2:1;
        unsigned int ia_dest_blend_factor:5;
        unsigned int ia_source_blend_factor:5;
        unsigned int pad1:1;
        unsigned int ia_blend_func:3;
        unsigned int pad0:1;
        unsigned int ia_blend_enable:1;
        unsigned int blend_enable:1;
    } blend0;

    struct {
        unsigned int post_blend_clamp_enable:1;
        unsigned int pre_blend_clamp_enable:1;
        unsigned int clamp_range:2;
        unsigned int pad0:4;
        unsigned int x_dither_offset:2;
        unsigned int y_dither_offset:2;
        unsigned int dither_enable:1;
        unsigned int alpha_test_func:3;
        unsigned int alpha_test_enable:1;
        unsigned int pad1:1;
        unsigned int logic_op_func:4;
        unsigned int logic_op_enable:1;
        unsigned int pad2:1;
        unsigned int write_disable_b:1;
        unsigned int write_disable_g:1;
        unsigned int write_disable_r:1;
        unsigned int write_disable_a:1;
        unsigned int pad3:1;
        unsigned int alpha_to_coverage_dither:1;
        unsigned int alpha_to_one:1;
        unsigned int alpha_to_coverage:1;
    } blend1;
};

struct gen6_color_calc_state
{
    struct {
        unsigned int alpha_test_format:1;
        unsigned int pad0:14;
        unsigned int round_disable:1;
        unsigned int bf_stencil_ref:8;
        unsigned int stencil_ref:8;
    } cc0;

    union {
        float alpha_ref_f;
        struct {
            unsigned int ui:8;
            unsigned int pad0:24;
        } alpha_ref_fi;
    } cc1;

    float constant_r;
    float constant_g;
    float constant_b;
    float constant_a;
};

struct gen6_depth_stencil_state
{
    struct {
        unsigned int pad0:3;
        unsigned int bf_stencil_pass_depth_pass_op:3;
        unsigned int bf_stencil_pass_depth_fail_op:3;
        unsigned int bf_stencil_fail_op:3;
        unsigned int bf_stencil_func:3;
        unsigned int bf_stencil_enable:1;
        unsigned int pad1:2;
        unsigned int stencil_write_enable:1;
        unsigned int stencil_pass_depth_pass_op:3;
        unsigned int stencil_pass_depth_fail_op:3;
        unsigned int stencil_fail_op:3;
        unsigned int stencil_func:3;
        unsigned int stencil_enable:1;
    } ds0;

    struct {
        unsigned int bf_stencil_write_mask:8;
        unsigned int bf_stencil_test_mask:8;
        unsigned int stencil_write_mask:8;
        unsigned int stencil_test_mask:8;
    } ds1;

    struct {
        unsigned int pad0:26;
        unsigned int depth_write_enable:1;
        unsigned int depth_test_func:3;
        unsigned int pad1:1;
        unsigned int depth_test_enable:1;
    } ds2;
};

struct gen6_interface_descriptor_data
{
    struct {
        unsigned int pad0:6;
        unsigned int kernel_start_pointer:26;
    } desc0;
    
    struct {
        unsigned int pad0:7;
        unsigned int software_exception_enable:1;
        unsigned int pad1:3;
        unsigned int maskstack_exception_enable:1;
        unsigned int pad2:1;
        unsigned int illegal_opcode_exception_enable:1;
        unsigned int pad3:2;
        unsigned int floating_point_mode:1;
        unsigned int thread_priority:1;
        unsigned int single_program_flow:1;
        unsigned int pad4:13;
    } desc1;

    struct {
        unsigned int pad0:2;
        unsigned int sampler_count:3;
        unsigned int sampler_state_pointer:27;
    } desc2;

    struct {
        unsigned int binding_table_entry_count:5;
        unsigned int binding_table_pointer:27;
    } desc3;

    struct {
        unsigned int constant_urb_entry_read_offset:16;
        unsigned int constant_urb_entry_read_length:16;
    } desc4;
    
    union {
        struct {
            unsigned int num_threads:8;
            unsigned int barrier_return_byte:8;
            unsigned int shared_local_memory_size:5;
            unsigned int barrier_enable:1;
            unsigned int rounding_mode:2;
            unsigned int barrier_return_grf_offset:8;
        } gen7;

        struct {
            unsigned int barrier_id:4;
            unsigned int pad0:28;
        } gen6;
    } desc5;

    struct {
        unsigned int cross_thread_constant_data_read_length:8;
        unsigned int pad0:24;
    } desc6;

    struct {
        unsigned int pad0;
    } desc7;
};

struct gen7_surface_state
{
    struct {
        unsigned int cube_pos_z:1;
        unsigned int cube_neg_z:1;
        unsigned int cube_pos_y:1;
        unsigned int cube_neg_y:1;
        unsigned int cube_pos_x:1;
        unsigned int cube_neg_x:1;
        unsigned int pad2:2;
        unsigned int render_cache_read_write:1;
        unsigned int pad1:1;
        unsigned int surface_array_spacing:1;
        unsigned int vert_line_stride_ofs:1;
        unsigned int vert_line_stride:1;
        unsigned int tile_walk:1;
        unsigned int tiled_surface:1;
        unsigned int horizontal_alignment:1;
        unsigned int vertical_alignment:2;
        unsigned int surface_format:9;     /**< BRW_SURFACEFORMAT_x */
        unsigned int pad0:1;
        unsigned int is_array:1;
        unsigned int surface_type:3;       /**< BRW_SURFACE_1D/2D/3D/CUBE */
    } ss0;

    struct {
        unsigned int base_addr;
    } ss1;

    struct {
        unsigned int width:14;
        unsigned int pad1:2;
        unsigned int height:14;
        unsigned int pad0:2;
    } ss2;

    struct {
        unsigned int pitch:18;
        unsigned int pad:3;
        unsigned int depth:11;
    } ss3;

    struct {
        unsigned int multisample_position_palette_index:3;
        unsigned int num_multisamples:3;
        unsigned int multisampled_surface_storage_format:1;
        unsigned int render_target_view_extent:11;
        unsigned int min_array_elt:11;
        unsigned int rotation:2;
        unsigned int pad0:1;
    } ss4;

    struct {
        unsigned int mip_count:4;
        unsigned int min_lod:4;
        unsigned int pad1:12;
        unsigned int y_offset:4;
        unsigned int pad0:1;
        unsigned int x_offset:7;
    } ss5;

    struct {
        unsigned int pad; /* Multisample Control Surface stuff */
    } ss6;

    struct {
        unsigned int resource_min_lod:12;
        unsigned int pad0:4;
        unsigned int shader_chanel_select_a:3;
        unsigned int shader_chanel_select_b:3;
        unsigned int shader_chanel_select_g:3;
        unsigned int shader_chanel_select_r:3;
        unsigned int alpha_clear_color:1;
        unsigned int blue_clear_color:1;
        unsigned int green_clear_color:1;
        unsigned int red_clear_color:1;
    } ss7;
};

struct gen7_sampler_state
{
   struct
   {
      unsigned int aniso_algorithm:1;
      unsigned int lod_bias:13;
      unsigned int min_filter:3;
      unsigned int mag_filter:3;
      unsigned int mip_filter:2;
      unsigned int base_level:5;
      unsigned int pad1:1;
      unsigned int lod_preclamp:1;
      unsigned int default_color_mode:1;
      unsigned int pad0:1;
      unsigned int disable:1;
   } ss0;

   struct
   {
      unsigned int cube_control_mode:1;
      unsigned int shadow_function:3;
      unsigned int pad:4;
      unsigned int max_lod:12;
      unsigned int min_lod:12;
   } ss1;

   struct
   {
      unsigned int pad:5;
      unsigned int default_color_pointer:27;
   } ss2;

   struct
   {
      unsigned int r_wrap_mode:3;
      unsigned int t_wrap_mode:3;
      unsigned int s_wrap_mode:3;
      unsigned int pad:1;
      unsigned int non_normalized_coord:1;
      unsigned int trilinear_quality:2;
      unsigned int address_round:6;
      unsigned int max_aniso:3;
      unsigned int chroma_key_mode:1;
      unsigned int chroma_key_index:2;
      unsigned int chroma_key_enable:1;
      unsigned int pad0:6;
   } ss3;
};

struct gen7_surface_state2
{
    struct {
        unsigned int surface_base_address;
    } ss0;

    struct {
        unsigned int cbcr_pixel_offset_v_direction:2;
        unsigned int picture_structure:2;
        unsigned int width:14;
        unsigned int height:14;
    } ss1;

    struct {
        unsigned int tile_walk:1;
        unsigned int tiled_surface:1;
        unsigned int half_pitch_for_chroma:1;
        unsigned int pitch:18;
        unsigned int pad0:1;
        unsigned int surface_object_control_data:4;
        unsigned int pad1:1;
        unsigned int interleave_chroma:1;
        unsigned int surface_format:4;
    } ss2;

    struct {
        unsigned int y_offset_for_cb:15;
        unsigned int pad0:1;
        unsigned int x_offset_for_cb:14;
        unsigned int pad1:2;
    } ss3;

    struct {
        unsigned int y_offset_for_cr:15;
        unsigned int pad0:1;
        unsigned int x_offset_for_cr:14;
        unsigned int pad1:2;
    } ss4;

    struct {
        unsigned int pad0;
    } ss5;

    struct {
        unsigned int pad0;
    } ss6;

    struct {
        unsigned int pad0;
    } ss7;
};

struct gen7_sampler_8x8
{
    struct {
        unsigned int global_noise_estimation:8;
        unsigned int pad0:8;
        unsigned int chroma_key_index:2;
        unsigned int chroma_key_enable:1;
        unsigned int pad1:10;
        unsigned int ief_bypass:1;
        unsigned int pad2:1;
        unsigned int disable_8x8_filter:1;
    } dw0;

    struct {
        unsigned int pad0:5;
        unsigned int sampler_8x8_state_pointer:27;
    } dw1;
    
    struct {
        unsigned int weak_edge_threshold:6;
        unsigned int pad0:2;
        unsigned int strong_edge_threshold:6;
        unsigned int pad1:2;
        unsigned int r5x_coefficient:5;
        unsigned int r5cx_coefficient:5;
        unsigned int r5c_coefficient:5;
        unsigned int pad2:1;
    } dw2;

    struct {
        unsigned int r3x_coefficient:5;
        unsigned int pad0:1;
        unsigned int r3c_coefficient:5;
        unsigned int pad1:3;
        unsigned int gain_factor:6;
        unsigned int non_edge_weight:3;
        unsigned int pad2:1;
        unsigned int regular_weight:3;
        unsigned int pad3:1;
        unsigned int strong_edge_weight:3;
        unsigned int ief4_smooth_enable:1;
    } dw3;
};

/* This can also be used for BDW+ */
struct gen7_sampler_dndi
{
    struct {
        unsigned int denoise_asd_threshold:8;
        unsigned int dnmh_delt:4;
        unsigned int vdi_walker_y_stride:2;
        unsigned int vdi_walker_frame_sharing_enable:1;
        unsigned int pad0:1;
        unsigned int denoise_maximum_history:8;
        unsigned int denoise_stad_threshold:8;
    } dw0;

    struct {
        unsigned int denoise_threshold_for_sum_of_complexity_measure:8;
        unsigned int denoise_moving_pixel_threshold:5;
        unsigned int stmm_c2:3;
        unsigned int low_temporal_difference_threshold:6;
        unsigned int pad0:2;
        unsigned int temporal_difference_threshold:6;
        unsigned int pad1:2;
    } dw1;

    struct {
        unsigned int block_noise_estimate_noise_threshold:8;
        unsigned int bne_edge_th:4;
        unsigned int pad0:2;
        unsigned int smooth_mv_th:2;
        unsigned int sad_tight_th:4;
        unsigned int cat_slope_minus1:4;
        unsigned int good_neighbor_th:6;
        unsigned int pad1:2;
   } dw2;

    struct {
        unsigned int maximum_stmm:8;
        unsigned int multipler_for_vecm:6;
        unsigned int pad0:2;
        unsigned int blending_constant_across_time_for_small_values_of_stmm:8;
        unsigned int blending_constant_across_time_for_large_values_of_stmm:7;
        unsigned int stmm_blending_constant_select:1;
    } dw3;

    struct {
        unsigned int sdi_delta:8;
        unsigned int sdi_threshold:8;
        unsigned int stmm_output_shift:4;
        unsigned int stmm_shift_up:2;
        unsigned int stmm_shift_down:2;
        unsigned int minimum_stmm:8;
    } dw4;

    struct {
        unsigned int fmd_temporal_difference_threshold:8;
        unsigned int sdi_fallback_mode_2_constant:8;
        unsigned int sdi_fallback_mode_1_t2_constant:8;
        unsigned int sdi_fallback_mode_1_t1_constant:8;
    } dw5;

    struct {
        unsigned int dn_enable:1;
        unsigned int di_enable:1;
        unsigned int di_partial:1;
        unsigned int dndi_top_first:1;
        unsigned int dndi_stream_id:1;
        unsigned int dndi_first_frame:1;
        unsigned int progressive_dn:1;
        unsigned int mcdi_enable:1;
        unsigned int fmd_tear_threshold:6;
        unsigned int cat_th1:2;
        unsigned int fmd2_vertical_difference_threshold:8;
        unsigned int fmd1_vertical_difference_threshold:8;
    } dw6;

    struct {
        unsigned int sad_tha:4;
        unsigned int sad_thb:4;
        unsigned int fmd_for_1st_field_of_current_frame:2;
        unsigned int mc_pixel_consistency_th:6;
        unsigned int fmd_for_2nd_field_of_previous_frame:2;
        unsigned int vdi_walker_enable:1;
        unsigned int neighborpixel_th:4;
        unsigned int column_width_minus1:9;
    } dw7;
};

struct gen8_sampler_8x8_avs_coefficients
{
    struct {
        unsigned int table_0x_filter_c0:8;
        unsigned int table_0y_filter_c0:8;
        unsigned int table_0x_filter_c1:8;
        unsigned int table_0y_filter_c1:8;
    } dw0;

    struct {
        unsigned int table_0x_filter_c2:8;
        unsigned int table_0y_filter_c2:8;
        unsigned int table_0x_filter_c3:8;
        unsigned int table_0y_filter_c3:8;
    } dw1;

    struct {
        unsigned int table_0x_filter_c4:8;
        unsigned int table_0y_filter_c4:8;
        unsigned int table_0x_filter_c5:8;
        unsigned int table_0y_filter_c5:8;
    } dw2;

    struct {
        unsigned int table_0x_filter_c6:8;
        unsigned int table_0y_filter_c6:8;
        unsigned int table_0x_filter_c7:8;
        unsigned int table_0y_filter_c7:8;
    } dw3;

    struct {
        unsigned int pad0:16;
        unsigned int table_1x_filter_c2:8;
        unsigned int table_1x_filter_c3:8;
    } dw4;

    struct {
        unsigned int table_1x_filter_c4:8;
        unsigned int table_1x_filter_c5:8;
        unsigned int pad0:16;
    } dw5;

    struct {
        unsigned int pad0:16;
        unsigned int table_1y_filter_c2:8;
        unsigned int table_1y_filter_c3:8;
    } dw6;

    struct {
        unsigned int table_1y_filter_c4:8;
        unsigned int table_1y_filter_c5:8;
        unsigned int pad0:16;
    } dw7;
};

struct gen8_sampler_8x8_avs {
    struct {
        unsigned int gain_factor:6;
        unsigned int weak_edge_threshold:6;
        unsigned int strong_edge_threshold:6;
        unsigned int r3x_coefficient:5;
        unsigned int r3c_coefficient:5;
        unsigned int chroma_key_index:2;
        unsigned int chroma_key_enable:1;
        unsigned int pad1:1;
    } dw0;

    struct {
        unsigned int pad0;
    } dw1;
    
    struct {
        unsigned int global_noise_estimation:8;
        unsigned int non_edge_weight:3;
        unsigned int regular_weight:3;
        unsigned int strong_edge_weight:3;
        unsigned int r5x_coefficient:5;
        unsigned int r5cx_coefficient:5;
        unsigned int r5c_coefficient:5;
    } dw2;
    
    struct {
	unsigned int sin_alpha:8; /* S0.7 */
	unsigned int cos_alpha:8; /* S0.7 */
	unsigned int sat_max:6;
	unsigned int hue_max:6;
	unsigned int enable_8tap_filter:2;
	unsigned int ief4_smooth_enable:1;
	unsigned int skin_ief_enable:1;
    } dw3;
    
    struct {
	unsigned int s3u:11; /* S2.8 */
	unsigned int pad0:1;
	unsigned int diamond_margin:3;
	unsigned int vy_std_enable:1;
	unsigned int umid:8;
	unsigned int vmid:8;
    } dw4;

    struct {
	unsigned int diamond_dv:7;
	unsigned int diamond_th:6;
	unsigned int diamond_alpha:8;
	unsigned int hs_margin:3;
	unsigned int diamond_du:7;
	unsigned int skin_detailfilter:1;
    } dw5;

    struct {
	unsigned int y_point1:8;
	unsigned int y_point2:8;
	unsigned int y_point3:8;
	unsigned int y_point4:8;
    } dw6;

    struct {
	unsigned int inv_margin_vyl:16;
	unsigned int pad0:16;
    } dw7;

    struct {
	unsigned int inv_margin_vyu:16;
	unsigned int p0l:8;
	unsigned int p1l:8;
    } dw8;

    struct {
	unsigned int p2l:8;
	unsigned int p3l:8;
	unsigned int b0l:8;
	unsigned int b1l:8;
    } dw9;

    struct {
	unsigned int b2l:8;
	unsigned int b3l:8;
	unsigned int s0l:11;
	unsigned int y_slope2:5;
    } dw10;

    struct {
	unsigned int s1l:11;
	unsigned int s2l:11;
	unsigned int pad0:10;
    } dw11;

    struct {
	unsigned int s3l:11;
	unsigned int p0u:8;
	unsigned int p1u:8;
	unsigned int y_slope1:5;
    } dw12;

    struct {
	unsigned int p2u:8;
	unsigned int p3u:8;
	unsigned int b0u:8;
	unsigned int b1u:8;
    } dw13;

    struct {
	unsigned int b2u:8;
	unsigned int b3u:8;
	unsigned int s0u:11;
	unsigned int pad0:5;
    } dw14;

    struct {
	unsigned int s1u:11;
	unsigned int s2u:11;
	unsigned int pad0:10;
    } dw15;

    /* DW16-DW151 */
    struct gen8_sampler_8x8_avs_coefficients coefficients[17];
    
    struct {
        unsigned int transition_area_with_8_pixels:3;
        unsigned int pad0:1;
        unsigned int transition_area_with_4_pixels:3;
        unsigned int pad1:1;
        unsigned int max_derivative_8_pixels:8;
        unsigned int max_derivative_4_pixels:8;
        unsigned int default_sharpness_level:8;
    } dw152;
  
    struct {
        unsigned int rgb_adaptive:1;
        unsigned int adaptive_filter_for_all_channel:1;
        unsigned int pad0:19;
        unsigned int bypass_y_adaptive_filtering:1;
        unsigned int bypass_x_adaptive_filtering:1;
        unsigned int pad1:9;
    } dw153;

    unsigned int reserved[6];

    /* DW160-DW279 */
    struct gen8_sampler_8x8_avs_coefficients coefficients1[15];
};

struct gen9_sampler_8x8_avs
{
    struct {
        unsigned int gain_factor:6;
        unsigned int weak_edge_threshold:6;
        unsigned int strong_edge_threshold:6;
        unsigned int r3x_coefficient:5;
        unsigned int r3c_coefficient:5;
        unsigned int pad1:4;
    } dw0;

    struct {
        unsigned int pad0;
    } dw1;

    struct {
        unsigned int global_noise_estimation:8;
        unsigned int non_edge_weight:3;
        unsigned int regular_weight:3;
        unsigned int strong_edge_weight:3;
        unsigned int r5x_coefficient:5;
        unsigned int r5cx_coefficient:5;
        unsigned int r5c_coefficient:5;
    } dw2;

    struct {
	unsigned int sin_alpha:8; /* S0.7 */
	unsigned int cos_alpha:8; /* S0.7 */
	unsigned int sat_max:6;
	unsigned int hue_max:6;
	unsigned int enable_8tap_adaptive_filter:2;
	unsigned int ief4_smooth_enable:1;
	unsigned int skin_ief_enable:1;
    } dw3;

    struct {
	unsigned int s3u:11; /* S2.8 */
	unsigned int shuffle_output_write_back:1;
	unsigned int diamond_margin:3;
	unsigned int vy_std_enable:1;
	unsigned int umid:8;
	unsigned int vmid:8;
    } dw4;

    struct {
	unsigned int diamond_dv:7;
	unsigned int diamond_th:6;
	unsigned int diamond_alpha:8;
	unsigned int hs_margin:3;
	unsigned int diamond_du:7;
	unsigned int skin_detailfilter:1;
    } dw5;

    struct {
	unsigned int y_point1:8;
	unsigned int y_point2:8;
	unsigned int y_point3:8;
	unsigned int y_point4:8;
    } dw6;

    struct {
	unsigned int inv_margin_vyl:16;
	unsigned int pad0:16;
    } dw7;

    struct {
	unsigned int inv_margin_vyu:16;
	unsigned int p0l:8;
	unsigned int p1l:8;
    } dw8;

    struct {
	unsigned int p2l:8;
	unsigned int p3l:8;
	unsigned int b0l:8;
	unsigned int b1l:8;
    } dw9;

    struct {
	unsigned int b2l:8;
	unsigned int b3l:8;
	unsigned int s0l:11;
	unsigned int y_slope2:5;
    } dw10;

    struct {
	unsigned int s1l:11;
	unsigned int s2l:11;
	unsigned int pad0:10;
    } dw11;

    struct {
	unsigned int s3l:11;
	unsigned int p0u:8;
	unsigned int p1u:8;
	unsigned int y_slope1:5;
    } dw12;

    struct {
	unsigned int p2u:8;
	unsigned int p3u:8;
	unsigned int b0u:8;
	unsigned int b1u:8;
    } dw13;

    struct {
	unsigned int b2u:8;
	unsigned int b3u:8;
	unsigned int s0u:11;
	unsigned int pad0:5;
    } dw14;

    struct {
	unsigned int s1u:11;
	unsigned int s2u:11;
	unsigned int pad0:10;
    } dw15;

    /* DW16-DW151 for 17 coeff tabls */
    struct gen8_sampler_8x8_avs_coefficients coefficients[17];

    struct {
        unsigned int transition_area_with_8_pixels:3;
        unsigned int pad0:1;
        unsigned int transition_area_with_4_pixels:3;
        unsigned int pad1:1;
        unsigned int max_derivative_8_pixels:8;
        unsigned int max_derivative_4_pixels:8;
        unsigned int default_sharpness_level:8;
    } dw152;

    struct {
        unsigned int rgb_adaptive:1;
        unsigned int adaptive_filter_for_all_channel:1;
        unsigned int pad0:19;
        unsigned int bypass_y_adaptive_filtering:1;
        unsigned int bypass_x_adaptive_filtering:1;
        unsigned int pad1:9;
    } dw153;

    unsigned int reserved1[6];

    /* 160-279 for 17..31 avs_coeff */
    struct gen8_sampler_8x8_avs_coefficients extra_coefficients[15];

    // 280 - 511 (padding to align it to 512 dwords)
    unsigned int reserved2[232];
};

#define SURFACE_STATE_PADDED_SIZE_0_GEN7        ALIGN(sizeof(struct gen7_surface_state), 32)
#define SURFACE_STATE_PADDED_SIZE_1_GEN7        ALIGN(sizeof(struct gen7_surface_state2), 32)
#define SURFACE_STATE_PADDED_SIZE_GEN7          MAX(SURFACE_STATE_PADDED_SIZE_0_GEN7, SURFACE_STATE_PADDED_SIZE_1_GEN7)

#define SURFACE_STATE_PADDED_SIZE_0_GEN6        ALIGN(sizeof(struct i965_surface_state), 32)
#define SURFACE_STATE_PADDED_SIZE_1_GEN6        ALIGN(sizeof(struct i965_surface_state2), 32)
#define SURFACE_STATE_PADDED_SIZE_GEN6          MAX(SURFACE_STATE_PADDED_SIZE_0_GEN6, SURFACE_STATE_PADDED_SIZE_1_GEN6)

#define SURFACE_STATE_PADDED_SIZE_0_GEN8        ALIGN(sizeof(struct gen8_surface_state), 32)
#define SURFACE_STATE_PADDED_SIZE_1_GEN8        ALIGN(sizeof(struct gen8_surface_state2), 32)
#define SURFACE_STATE_PADDED_SIZE_GEN8          MAX(SURFACE_STATE_PADDED_SIZE_0_GEN8, SURFACE_STATE_PADDED_SIZE_1_GEN8)

#define SURFACE_STATE_PADDED_SIZE_0_GEN9        ALIGN(sizeof(struct gen9_surface_state), 32)
#define SURFACE_STATE_PADDED_SIZE_1_GEN9        ALIGN(sizeof(struct gen9_surface_state2), 32)
#define SURFACE_STATE_PADDED_SIZE_GEN9          MAX(SURFACE_STATE_PADDED_SIZE_0_GEN9, SURFACE_STATE_PADDED_SIZE_1_GEN9)

#endif /* _I965_STRUCTS_H_ */
