blob: e2be147c90178f7e850cd5a321cd1570133cec13 [file] [log] [blame]
/**************************************************************************
*
* Copyright 2005 Tungsten Graphics, Inc., Cedar Park, Texas.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#ifndef BRW_STRUCTS_H
#define BRW_STRUCTS_H
/* Command packets:
*/
struct header
{
GLuint length:16;
GLuint opcode:16;
} bits;
union header_union
{
struct header bits;
GLuint dword;
};
struct brw_3d_control
{
struct
{
GLuint length:8;
GLuint notify_enable:1;
GLuint pad:3;
GLuint wc_flush_enable:1;
GLuint depth_stall_enable:1;
GLuint operation:2;
GLuint opcode:16;
} header;
struct
{
GLuint pad:2;
GLuint dest_addr_type:1;
GLuint dest_addr:29;
} dest;
GLuint dword2;
GLuint dword3;
};
struct brw_3d_primitive
{
struct
{
GLuint length:8;
GLuint pad:2;
GLuint topology:5;
GLuint indexed:1;
GLuint opcode:16;
} header;
GLuint verts_per_instance;
GLuint start_vert_location;
GLuint instance_count;
GLuint start_instance_location;
GLuint base_vert_location;
};
/* These seem to be passed around as function args, so it works out
* better to keep them as #defines:
*/
#define BRW_FLUSH_READ_CACHE 0x1
#define BRW_FLUSH_STATE_CACHE 0x2
#define BRW_INHIBIT_FLUSH_RENDER_CACHE 0x4
#define BRW_FLUSH_SNAPSHOT_COUNTERS 0x8
struct brw_mi_flush
{
GLuint flags:4;
GLuint pad:12;
GLuint opcode:16;
};
struct brw_vf_statistics
{
GLuint statistics_enable:1;
GLuint pad:15;
GLuint opcode:16;
};
struct brw_binding_table_pointers
{
struct header header;
GLuint vs;
GLuint gs;
GLuint clp;
GLuint sf;
GLuint wm;
};
struct brw_blend_constant_color
{
struct header header;
GLfloat blend_constant_color[4];
};
struct brw_depthbuffer
{
union header_union header;
union {
struct {
GLuint pitch:18;
GLuint format:3;
GLuint pad:4;
GLuint depth_offset_disable:1;
GLuint tile_walk:1;
GLuint tiled_surface:1;
GLuint pad2:1;
GLuint surface_type:3;
} bits;
GLuint dword;
} dword1;
GLuint dword2_base_addr;
union {
struct {
GLuint pad:1;
GLuint mipmap_layout:1;
GLuint lod:4;
GLuint width:13;
GLuint height:13;
} bits;
GLuint dword;
} dword3;
union {
struct {
GLuint pad:12;
GLuint min_array_element:9;
GLuint depth:11;
} bits;
GLuint dword;
} dword4;
};
struct brw_drawrect
{
struct header header;
GLuint xmin:16;
GLuint ymin:16;
GLuint xmax:16;
GLuint ymax:16;
GLuint xorg:16;
GLuint yorg:16;
};
struct brw_global_depth_offset_clamp
{
struct header header;
GLfloat depth_offset_clamp;
};
struct brw_indexbuffer
{
union {
struct
{
GLuint length:8;
GLuint index_format:2;
GLuint cut_index_enable:1;
GLuint pad:5;
GLuint opcode:16;
} bits;
GLuint dword;
} header;
GLuint buffer_start;
GLuint buffer_end;
};
struct brw_line_stipple
{
struct header header;
struct
{
GLuint pattern:16;
GLuint pad:16;
} bits0;
struct
{
GLuint repeat_count:9;
GLuint pad:7;
GLuint inverse_repeat_count:16;
} bits1;
};
struct brw_pipelined_state_pointers
{
struct header header;
struct {
GLuint pad:5;
GLuint offset:27;
} vs;
struct
{
GLuint enable:1;
GLuint pad:4;
GLuint offset:27;
} gs;
struct
{
GLuint enable:1;
GLuint pad:4;
GLuint offset:27;
} clp;
struct
{
GLuint pad:5;
GLuint offset:27;
} sf;
struct
{
GLuint pad:5;
GLuint offset:27;
} wm;
struct
{
GLuint pad:5;
GLuint offset:27; /* KW: check me! */
} cc;
};
struct brw_polygon_stipple_offset
{
struct header header;
struct {
GLuint y_offset:5;
GLuint pad:3;
GLuint x_offset:5;
GLuint pad0:19;
} bits0;
};
struct brw_polygon_stipple
{
struct header header;
GLuint stipple[32];
};
struct brw_pipeline_select
{
struct
{
GLuint pipeline_select:1;
GLuint pad:15;
GLuint opcode:16;
} header;
};
struct brw_pipe_control
{
struct
{
GLuint length:8;
GLuint notify_enable:1;
GLuint pad:2;
GLuint instruction_state_cache_flush_enable:1;
GLuint write_cache_flush_enable:1;
GLuint depth_stall_enable:1;
GLuint post_sync_operation:2;
GLuint opcode:16;
} header;
struct
{
GLuint pad:2;
GLuint dest_addr_type:1;
GLuint dest_addr:29;
} bits1;
GLuint data0;
GLuint data1;
};
struct brw_urb_fence
{
struct
{
GLuint length:8;
GLuint vs_realloc:1;
GLuint gs_realloc:1;
GLuint clp_realloc:1;
GLuint sf_realloc:1;
GLuint vfe_realloc:1;
GLuint cs_realloc:1;
GLuint pad:2;
GLuint opcode:16;
} header;
struct
{
GLuint vs_fence:10;
GLuint gs_fence:10;
GLuint clp_fence:10;
GLuint pad:2;
} bits0;
struct
{
GLuint sf_fence:10;
GLuint vf_fence:10;
GLuint cs_fence:10;
GLuint pad:2;
} bits1;
};
struct brw_constant_buffer_state /* previously brw_command_streamer */
{
struct header header;
struct
{
GLuint nr_urb_entries:3;
GLuint pad:1;
GLuint urb_entry_size:5;
GLuint pad0:23;
} bits0;
};
struct brw_constant_buffer
{
struct
{
GLuint length:8;
GLuint valid:1;
GLuint pad:7;
GLuint opcode:16;
} header;
struct
{
GLuint buffer_length:6;
GLuint buffer_address:26;
} bits0;
};
struct brw_state_base_address
{
struct header header;
struct
{
GLuint modify_enable:1;
GLuint pad:4;
GLuint general_state_address:27;
} bits0;
struct
{
GLuint modify_enable:1;
GLuint pad:4;
GLuint surface_state_address:27;
} bits1;
struct
{
GLuint modify_enable:1;
GLuint pad:4;
GLuint indirect_object_state_address:27;
} bits2;
struct
{
GLuint modify_enable:1;
GLuint pad:11;
GLuint general_state_upper_bound:20;
} bits3;
struct
{
GLuint modify_enable:1;
GLuint pad:11;
GLuint indirect_object_state_upper_bound:20;
} bits4;
};
struct brw_state_prefetch
{
struct header header;
struct
{
GLuint prefetch_count:3;
GLuint pad:3;
GLuint prefetch_pointer:26;
} bits0;
};
struct brw_system_instruction_pointer
{
struct header header;
struct
{
GLuint pad:4;
GLuint system_instruction_pointer:28;
} bits0;
};
/* State structs for the various fixed function units:
*/
struct thread0
{
GLuint pad0:1;
GLuint grf_reg_count:3;
GLuint pad1:2;
GLuint kernel_start_pointer:26;
};
struct thread1
{
GLuint ext_halt_exception_enable:1;
GLuint sw_exception_enable:1;
GLuint mask_stack_exception_enable:1;
GLuint timeout_exception_enable:1;
GLuint illegal_op_exception_enable:1;
GLuint pad0:3;
GLuint depth_coef_urb_read_offset:6; /* WM only */
GLuint pad1:2;
GLuint floating_point_mode:1;
GLuint thread_priority:1;
GLuint binding_table_entry_count:8;
GLuint pad3:5;
GLuint single_program_flow:1;
};
struct thread2
{
GLuint per_thread_scratch_space:4;
GLuint pad0:6;
GLuint scratch_space_base_pointer:22;
};
struct thread3
{
GLuint dispatch_grf_start_reg:4;
GLuint urb_entry_read_offset:6;
GLuint pad0:1;
GLuint urb_entry_read_length:6;
GLuint pad1:1;
GLuint const_urb_entry_read_offset:6;
GLuint pad2:1;
GLuint const_urb_entry_read_length:6;
GLuint pad3:1;
};
struct brw_clip_unit_state
{
struct thread0 thread0;
struct thread1 thread1;
struct thread2 thread2;
struct thread3 thread3;
struct
{
GLuint pad0:9;
GLuint gs_output_stats:1; /* not always */
GLuint stats_enable:1;
GLuint nr_urb_entries:7;
GLuint pad1:1;
GLuint urb_entry_allocation_size:5;
GLuint pad2:1;
GLuint max_threads:6; /* may be less */
GLuint pad3:1;
} thread4;
struct
{
GLuint pad0:13;
GLuint clip_mode:3;
GLuint userclip_enable_flags:8;
GLuint userclip_must_clip:1;
GLuint pad1:1;
GLuint guard_band_enable:1;
GLuint viewport_z_clip_enable:1;
GLuint viewport_xy_clip_enable:1;
GLuint vertex_position_space:1;
GLuint api_mode:1;
GLuint pad2:1;
} clip5;
struct
{
GLuint pad0:5;
GLuint clipper_viewport_state_ptr:27;
} clip6;
GLfloat viewport_xmin;
GLfloat viewport_xmax;
GLfloat viewport_ymin;
GLfloat viewport_ymax;
};
struct brw_cc_unit_state
{
struct
{
GLuint pad0:3;
GLuint bf_stencil_pass_depth_pass_op:3;
GLuint bf_stencil_pass_depth_fail_op:3;
GLuint bf_stencil_fail_op:3;
GLuint bf_stencil_func:3;
GLuint bf_stencil_enable:1;
GLuint pad1:2;
GLuint stencil_write_enable:1;
GLuint stencil_pass_depth_pass_op:3;
GLuint stencil_pass_depth_fail_op:3;
GLuint stencil_fail_op:3;
GLuint stencil_func:3;
GLuint stencil_enable:1;
} cc0;
struct
{
GLuint bf_stencil_ref:8;
GLuint stencil_write_mask:8;
GLuint stencil_test_mask:8;
GLuint stencil_ref:8;
} cc1;
struct
{
GLuint logicop_enable:1;
GLuint pad0:10;
GLuint depth_write_enable:1;
GLuint depth_test_function:3;
GLuint depth_test:1;
GLuint bf_stencil_write_mask:8;
GLuint bf_stencil_test_mask:8;
} cc2;
struct
{
GLuint pad0:8;
GLuint alpha_test_func:3;
GLuint alpha_test:1;
GLuint blend_enable:1;
GLuint ia_blend_enable:1;
GLuint pad1:1;
GLuint alpha_test_format:1;
GLuint pad2:16;
} cc3;
struct
{
GLuint pad0:5;
GLuint cc_viewport_state_offset:27;
} cc4;
struct
{
GLuint pad0:2;
GLuint ia_dest_blend_factor:5;
GLuint ia_src_blend_factor:5;
GLuint ia_blend_function:3;
GLuint statistics_enable:1;
GLuint logicop_func:4;
GLuint pad1:11;
GLuint dither_enable:1;
} cc5;
struct
{
GLuint clamp_post_alpha_blend:1;
GLuint clamp_pre_alpha_blend:1;
GLuint clamp_range:2;
GLuint pad0:11;
GLuint y_dither_offset:2;
GLuint x_dither_offset:2;
GLuint dest_blend_factor:5;
GLuint src_blend_factor:5;
GLuint blend_function:3;
} cc6;
struct {
union {
GLfloat f;
GLubyte ub[4];
} alpha_ref;
} cc7;
};
struct brw_sf_unit_state
{
struct thread0 thread0;
struct thread1 thread1;
struct thread2 thread2;
struct thread3 thread3;
struct
{
GLuint pad0:10;
GLuint stats_enable:1;
GLuint nr_urb_entries:7;
GLuint pad1:1;
GLuint urb_entry_allocation_size:5;
GLuint pad2:1;
GLuint max_threads:6;
GLuint pad3:1;
} thread4;
struct
{
GLuint front_winding:1;
GLuint viewport_transform:1;
GLuint pad0:3;
GLuint sf_viewport_state_offset:27;
} sf5;
struct
{
GLuint pad0:9;
GLuint dest_org_vbias:4;
GLuint dest_org_hbias:4;
GLuint scissor:1;
GLuint disable_2x2_trifilter:1;
GLuint disable_zero_pix_trifilter:1;
GLuint point_rast_rule:2;
GLuint line_endcap_aa_region_width:2;
GLuint line_width:4;
GLuint fast_scissor_disable:1;
GLuint cull_mode:2;
GLuint aa_enable:1;
} sf6;
struct
{
GLuint point_size:11;
GLuint use_point_size_state:1;
GLuint subpixel_precision:1;
GLuint sprite_point:1;
GLuint pad0:11;
GLuint trifan_pv:2;
GLuint linestrip_pv:2;
GLuint tristrip_pv:2;
GLuint line_last_pixel_enable:1;
} sf7;
};
struct brw_gs_unit_state
{
struct thread0 thread0;
struct thread1 thread1;
struct thread2 thread2;
struct thread3 thread3;
struct
{
GLuint pad0:10;
GLuint stats_enable:1;
GLuint nr_urb_entries:7;
GLuint pad1:1;
GLuint urb_entry_allocation_size:5;
GLuint pad2:1;
GLuint max_threads:1;
GLuint pad3:6;
} thread4;
struct
{
GLuint sampler_count:3;
GLuint pad0:2;
GLuint sampler_state_pointer:27;
} gs5;
struct
{
GLuint max_vp_index:4;
GLuint pad0:26;
GLuint reorder_enable:1;
GLuint pad1:1;
} gs6;
};
struct brw_vs_unit_state
{
struct thread0 thread0;
struct thread1 thread1;
struct thread2 thread2;
struct thread3 thread3;
struct
{
GLuint pad0:10;
GLuint stats_enable:1;
GLuint nr_urb_entries:7;
GLuint pad1:1;
GLuint urb_entry_allocation_size:5;
GLuint pad2:1;
GLuint max_threads:4;
GLuint pad3:3;
} thread4;
struct
{
GLuint sampler_count:3;
GLuint pad0:2;
GLuint sampler_state_pointer:27;
} vs5;
struct
{
GLuint vs_enable:1;
GLuint vert_cache_disable:1;
GLuint pad0:30;
} vs6;
};
struct brw_wm_unit_state
{
struct thread0 thread0;
struct thread1 thread1;
struct thread2 thread2;
struct thread3 thread3;
struct {
GLuint stats_enable:1;
GLuint pad0:1;
GLuint sampler_count:3;
GLuint sampler_state_pointer:27;
} wm4;
struct
{
GLuint enable_8_pix:1;
GLuint enable_16_pix:1;
GLuint enable_32_pix:1;
GLuint pad0:7;
GLuint legacy_global_depth_bias:1;
GLuint line_stipple:1;
GLuint depth_offset:1;
GLuint polygon_stipple:1;
GLuint line_aa_region_width:2;
GLuint line_endcap_aa_region_width:2;
GLuint early_depth_test:1;
GLuint thread_dispatch_enable:1;
GLuint program_uses_depth:1;
GLuint program_computes_depth:1;
GLuint program_uses_killpixel:1;
GLuint legacy_line_rast: 1;
GLuint pad1:1;
GLuint max_threads:6;
GLuint pad2:1;
} wm5;
GLfloat global_depth_offset_constant;
GLfloat global_depth_offset_scale;
};
struct brw_sampler_default_color {
GLfloat color[4];
};
struct brw_sampler_state
{
struct
{
GLuint shadow_function:3;
GLuint lod_bias:11;
GLuint min_filter:3;
GLuint mag_filter:3;
GLuint mip_filter:2;
GLuint base_level:5;
GLuint pad:1;
GLuint lod_preclamp:1;
GLuint default_color_mode:1;
GLuint pad0:1;
GLuint disable:1;
} ss0;
struct
{
GLuint r_wrap_mode:3;
GLuint t_wrap_mode:3;
GLuint s_wrap_mode:3;
GLuint pad:3;
GLuint max_lod:10;
GLuint min_lod:10;
} ss1;
struct
{
GLuint pad:5;
GLuint default_color_pointer:27;
} ss2;
struct
{
GLuint pad:19;
GLuint max_aniso:3;
GLuint chroma_key_mode:1;
GLuint chroma_key_index:2;
GLuint chroma_key_enable:1;
GLuint monochrome_filter_width:3;
GLuint monochrome_filter_height:3;
} ss3;
};
struct brw_clipper_viewport
{
GLfloat xmin;
GLfloat xmax;
GLfloat ymin;
GLfloat ymax;
};
struct brw_cc_viewport
{
GLfloat min_depth;
GLfloat max_depth;
};
struct brw_sf_viewport
{
struct {
GLfloat m00;
GLfloat m11;
GLfloat m22;
GLfloat m30;
GLfloat m31;
GLfloat m32;
} viewport;
struct {
GLshort xmin;
GLshort ymin;
GLshort xmax;
GLshort ymax;
} scissor;
};
/* Documented in the subsystem/shared-functions/sampler chapter...
*/
struct brw_surface_state
{
struct {
GLuint cube_pos_z:1;
GLuint cube_neg_z:1;
GLuint cube_pos_y:1;
GLuint cube_neg_y:1;
GLuint cube_pos_x:1;
GLuint cube_neg_x:1;
GLuint pad:4;
GLuint mipmap_layout_mode:1;
GLuint vert_line_stride_ofs:1;
GLuint vert_line_stride:1;
GLuint color_blend:1;
GLuint writedisable_blue:1;
GLuint writedisable_green:1;
GLuint writedisable_red:1;
GLuint writedisable_alpha:1;
GLuint surface_format:9;
GLuint data_return_format:1;
GLuint pad0:1;
GLuint surface_type:3;
} ss0;
struct {
GLuint base_addr;
} ss1;
struct {
GLuint pad:2;
GLuint mip_count:4;
GLuint width:13;
GLuint height:13;
} ss2;
struct {
GLuint tile_walk:1;
GLuint tiled_surface:1;
GLuint pad:1;
GLuint pitch:18;
GLuint depth:11;
} ss3;
struct {
GLuint pad:19;
GLuint min_array_elt:9;
GLuint min_lod:4;
} ss4;
};
struct brw_vertex_buffer_state
{
struct {
GLuint pitch:11;
GLuint pad:15;
GLuint access_type:1;
GLuint vb_index:5;
} vb0;
GLuint start_addr;
GLuint max_index;
#if 1
GLuint instance_data_step_rate; /* not included for sequential/random vertices? */
#endif
};
#define BRW_VBP_MAX 17
struct brw_vb_array_state {
struct header header;
struct brw_vertex_buffer_state vb[BRW_VBP_MAX];
};
struct brw_vertex_element_state
{
struct
{
GLuint src_offset:11;
GLuint pad:5;
GLuint src_format:9;
GLuint pad0:1;
GLuint valid:1;
GLuint vertex_buffer_index:5;
} ve0;
struct
{
GLuint dst_offset:8;
GLuint pad:8;
GLuint vfcomponent3:4;
GLuint vfcomponent2:4;
GLuint vfcomponent1:4;
GLuint vfcomponent0:4;
} ve1;
};
#define BRW_VEP_MAX 18
struct brw_vertex_element_packet {
struct header header;
struct brw_vertex_element_state ve[BRW_VEP_MAX]; /* note: less than _TNL_ATTRIB_MAX */
};
struct brw_urb_immediate {
GLuint opcode:4;
GLuint offset:6;
GLuint swizzle_control:2;
GLuint pad:1;
GLuint allocate:1;
GLuint used:1;
GLuint complete:1;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad1:3;
GLuint end_of_thread:1;
};
/* Instruction format for the execution units:
*/
struct brw_instruction
{
struct
{
GLuint opcode:7;
GLuint pad:1;
GLuint access_mode:1;
GLuint mask_control:1;
GLuint dependency_control:2;
GLuint compression_control:2; /* gen6: quater control */
GLuint thread_control:2;
GLuint predicate_control:4;
GLuint predicate_inverse:1;
GLuint execution_size:3;
/**
* Conditional Modifier for most instructions. On Gen6+, this is also
* used for the SEND instruction's Message Target/SFID.
*/
GLuint destreg__conditionalmod:4;
GLuint acc_wr_control:1;
GLuint cmpt_control:1;
GLuint debug_control:1;
GLuint saturate:1;
} header;
union {
struct
{
GLuint dest_reg_file:2; /* 0x00000003 */
GLuint dest_reg_type:3; /* 0x0000001c */
GLuint src0_reg_file:2; /* 0x00000060 */
GLuint src0_reg_type:3; /* 0x00000380 */
GLuint src1_reg_file:2; /* 0x00000c00 */
GLuint src1_reg_type:3; /* 0x00007000 */
GLuint pad:1; /* 0x00008000 */
GLuint dest_subreg_nr:5; /* 0x001f0000 */
GLuint dest_reg_nr:8; /* 0x1f700000 */
GLuint dest_horiz_stride:2; /* 0x60000000 */
GLuint dest_address_mode:1; /* 0x80000000 */
} da1; /* direct align1 */
struct
{
GLuint dest_reg_file:2;
GLuint dest_reg_type:3;
GLuint src0_reg_file:2;
GLuint src0_reg_type:3;
GLuint src1_reg_file:2; /* 0x00000c00 */
GLuint src1_reg_type:3; /* 0x00007000 */
GLuint pad:1;
GLint dest_indirect_offset:10; /* offset against the deref'd address reg */
GLuint dest_subreg_nr:3; /* subnr for the address reg a0.x */
GLuint dest_horiz_stride:2;
GLuint dest_address_mode:1;
} ia1; /* indirect align1 */
struct
{
GLuint dest_reg_file:2;
GLuint dest_reg_type:3;
GLuint src0_reg_file:2;
GLuint src0_reg_type:3;
GLuint src1_reg_file:2;
GLuint src1_reg_type:3;
GLuint pad0:1;
GLuint dest_writemask:4;
GLuint dest_subreg_nr:1;
GLuint dest_reg_nr:8;
GLuint dest_horiz_stride:2;
GLuint dest_address_mode:1;
} da16; /* direct align16 */
struct
{
GLuint dest_reg_file:2;
GLuint dest_reg_type:3;
GLuint src0_reg_file:2;
GLuint src0_reg_type:3;
GLuint pad0:6;
GLuint dest_writemask:4;
GLint dest_indirect_offset:6;
GLuint dest_subreg_nr:3;
GLuint dest_horiz_stride:2;
GLuint dest_address_mode:1;
} ia16; /* indirect align16 */
struct
{
GLuint dest_reg_file:1; /* used in Gen6, deleted in Gen7 */
GLuint flag_subreg_nr:1;
GLuint flag_reg_nr:1; /* not in Gen6. Add in Gen7 */
GLuint pad1:1; /* reserved */
GLuint src0_modifier:2;
GLuint src1_modifier:2;
GLuint src2_modifier:2;
GLuint src_reg_type:2;
GLuint dest_reg_type:2;
GLuint pad2:1; /* reserved */
GLuint nib_ctrl:1;
GLuint pad3:1; /* reserved */
GLuint dest_writemask:4;
GLuint dest_subreg_nr:3;
GLuint dest_reg_nr:8;
} da3src;
struct
{
GLuint pad:16;
GLint JIP:16;
} branch; /* conditional branch JIP for Gen6 only */
} bits1;
union {
struct
{
GLuint src0_subreg_nr:5; /* 0x0000001f */
GLuint src0_reg_nr:8; /* 0x00001fe0 */
GLuint src0_abs:1; /* 0x00002000 */
GLuint src0_negate:1; /* 0x00004000 */
GLuint src0_address_mode:1; /* 0x00008000 */
GLuint src0_horiz_stride:2; /* 0x00030000 */
GLuint src0_width:3; /* 0x001c0000 */
GLuint src0_vert_stride:4; /* 0x01e00000 */
GLuint flag_subreg_nr:1; /* 0x02000000 */
GLuint flag_reg_nr:1; /* 0x04000000 */
GLuint pad:5; /* 0xf8000000 */
} da1; /* direct align1 */
struct
{
GLint src0_indirect_offset:10;
GLuint src0_subreg_nr:3;
GLuint src0_abs:1;
GLuint src0_negate:1;
GLuint src0_address_mode:1;
GLuint src0_horiz_stride:2;
GLuint src0_width:3;
GLuint src0_vert_stride:4;
GLuint flag_subreg_nr:1;
GLuint flag_reg_nr:1;
GLuint pad:5;
} ia1; /* indirect align1 */
struct
{
GLuint src0_swz_x:2;
GLuint src0_swz_y:2;
GLuint src0_subreg_nr:1;
GLuint src0_reg_nr:8;
GLuint src0_abs:1;
GLuint src0_negate:1;
GLuint src0_address_mode:1;
GLuint src0_swz_z:2;
GLuint src0_swz_w:2;
GLuint pad0:1;
GLuint src0_vert_stride:4;
GLuint flag_subreg_nr:1;
GLuint flag_reg_nr:1;
GLuint pad1:5;
} da16; /* direct align16 */
struct
{
GLuint src0_swz_x:2;
GLuint src0_swz_y:2;
GLint src0_indirect_offset:6;
GLuint src0_subreg_nr:3;
GLuint src0_abs:1;
GLuint src0_negate:1;
GLuint src0_address_mode:1;
GLuint src0_swz_z:2;
GLuint src0_swz_w:2;
GLuint pad0:1;
GLuint src0_vert_stride:4;
GLuint flag_subreg_nr:1;
GLuint flag_reg_nr:1;
GLuint pad1:5;
} ia16; /* indirect align16 */
struct
{
GLuint src0_rep_ctrl:1;
GLuint src0_swizzle:8;
GLuint src0_subreg_nr:3;
GLuint src0_reg_nr:8;
GLuint pad0:1; /* reserved */
GLuint src1_rep_ctrl:1;
GLuint src1_swizzle:8;
GLuint src1_subreg_nr_low:2; /* src1_subreg_nr spans on two DWORDs */
} da3src;
struct
{
GLuint pad:26;
GLuint end_of_thread:1;
GLuint pad1:1;
GLuint sfid:4;
} send_gen5; /* for GEN5 only */
struct
{
GLuint pad:26;
GLuint msg_ext:6;
} msg_ext;
} bits2;
union
{
struct
{
GLuint src1_subreg_nr:5;
GLuint src1_reg_nr:8;
GLuint src1_abs:1;
GLuint src1_negate:1;
GLuint src1_address_mode:1;
GLuint src1_horiz_stride:2;
GLuint src1_width:3;
GLuint src1_vert_stride:4;
GLuint pad0:7;
} da1; /* direct align1 */
struct
{
GLuint src1_swz_x:2;
GLuint src1_swz_y:2;
GLuint src1_subreg_nr:1;
GLuint src1_reg_nr:8;
GLuint src1_abs:1;
GLuint src1_negate:1;
GLuint src1_address_mode:1;
GLuint src1_swz_z:2;
GLuint src1_swz_w:2;
GLuint pad1:1;
GLuint src1_vert_stride:4;
GLuint pad2:7;
} da16; /* direct align16 */
struct
{
GLint src1_indirect_offset:10;
GLuint src1_subreg_nr:3;
GLuint src1_abs:1;
GLuint src1_negate:1;
GLuint src1_address_mode:1;
GLuint src1_horiz_stride:2;
GLuint src1_width:3;
GLuint src1_vert_stride:4;
GLuint pad1:7;
} ia1; /* indirect align1 */
struct
{
GLuint src1_swz_x:2;
GLuint src1_swz_y:2;
GLint src1_indirect_offset:6;
GLuint src1_subreg_nr:3;
GLuint src1_abs:1;
GLuint src1_negate:1;
GLuint src1_address_mode:1;
GLuint src1_swz_z:2;
GLuint src1_swz_w:2;
GLuint pad1:1;
GLuint src1_vert_stride:4;
GLuint pad2:7;
} ia16; /* indirect align16 */
struct
{
GLuint src1_subreg_nr_high:1; /* src1_subreg_nr spans on two DWORDs */
GLuint src1_reg_nr:8;
GLuint pad0:1; /* reserved */
GLuint src2_rep_ctrl:1;
GLuint src2_swizzle:8;
GLuint src2_subreg_nr:3;
GLuint src2_reg_nr:8;
GLuint pad1:2; /* reserved */
} da3src;
struct
{
GLint JIP:16; /* Gen7 bspec: both the JIP and UIP are signed 16-bit numbers */
GLint UIP:16;
} branch_2_offset; /* for Gen6, Gen7 2-offsets branch; for Gen7 1-offset branch */
GLint JIP; /* used by Gen6 CALL instructions; Gen7 JMPI */
struct {
GLuint function:4;
GLuint int_type:1;
GLuint precision:1;
GLuint saturate:1;
GLuint data_type:1;
GLuint pad0:8;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad1:3;
GLuint end_of_thread:1;
} math;
struct {
GLuint binding_table_index:8;
GLuint sampler:4;
GLuint return_format:2;
GLuint msg_type:2;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad1:3;
GLuint end_of_thread:1;
} sampler;
struct brw_urb_immediate urb;
struct {
GLuint binding_table_index:8;
GLuint msg_control:4;
GLuint msg_type:2;
GLuint target_cache:2;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad1:3;
GLuint end_of_thread:1;
} dp_read;
struct {
GLuint binding_table_index:8;
GLuint msg_control:3;
GLuint pixel_scoreboard_clear:1;
GLuint msg_type:3;
GLuint send_commit_msg:1;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad1:3;
GLuint end_of_thread:1;
} dp_write;
struct {
GLuint opcode:1;
GLuint requester_type:1;
GLuint pad:2;
GLuint resource_select:1;
GLuint pad1:11;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad2:3;
GLuint end_of_thread:1;
} thread_spawner;
struct {
GLuint pad:16;
GLuint response_length:4;
GLuint msg_length:4;
GLuint msg_target:4;
GLuint pad1:3;
GLuint end_of_thread:1;
} generic;
struct {
GLuint function:4;
GLuint int_type:1;
GLuint precision:1;
GLuint saturate:1;
GLuint data_type:1;
GLuint snapshot:1;
GLuint pad0:10;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} math_gen5;
struct {
GLuint opcode:4;
GLuint offset:6;
GLuint swizzle_control:2;
GLuint pad:1;
GLuint allocate:1;
GLuint used:1;
GLuint complete:1;
GLuint pad0:3;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} urb_gen5;
struct {
GLuint binding_table_index:8;
GLuint sampler:4;
GLuint msg_type:4;
GLuint simd_mode:2;
GLuint pad0:1;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} sampler_gen5;
struct {
GLuint binding_table_index:8;
GLuint sampler:4;
GLuint msg_type:5;
GLuint simd_mode:2;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} sampler_gen7;
struct {
GLuint binding_table_index:8;
GLuint msg_control:4;
GLuint msg_type:2;
GLuint target_cache:2;
GLuint pad0:3;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} dp_read_gen5;
/**
* Message for the Sandybridge Sampler Cache or Constant Cache Data Port.
*
* See the Sandybridge PRM, Volume 4 Part 1, Section 3.9.2.1.1.
**/
struct {
GLuint binding_table_index:8;
GLuint msg_control:5;
GLuint msg_type:3;
GLuint pad0:3;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} gen6_dp_sampler_const_cache;
struct {
GLuint binding_table_index:8;
GLuint msg_control:3;
GLuint pixel_scoreboard_clear:1;
GLuint msg_type:3;
GLuint send_commit_msg:1;
GLuint pad0:3;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} dp_write_gen5;
struct {
GLuint binding_table_index:8;
GLuint msg_control:5;
GLuint msg_type:4;
GLuint send_commit_msg:1;
GLuint pad0:1;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} dp_write_gen6;
struct {
GLuint binding_table_index:8;
GLuint msg_control:5;
GLuint msg_type:4;
GLuint send_commit_msg:1; /* ignore on read message */
GLuint pad0:1;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} dp_gen6;
struct {
GLuint binding_table_index:8;
GLuint msg_control:6;
GLuint msg_type:4;
GLuint category:1;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} dp_gen7;
struct {
GLuint opcode:1;
GLuint requester_type:1;
GLuint pad0:2;
GLuint resource_select:1;
GLuint pad1:14;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad2:2;
GLuint end_of_thread:1;
} thread_spawner_gen5;
struct {
GLuint binding_table_index:8;
GLuint search_path_index:3;
GLuint lut_subindex:2;
GLuint message_type:2;
GLuint pad0:4;
GLuint header_present:1;
} vme_gen6;
struct {
GLuint binding_table_index:8;
GLuint pad0:5;
GLuint message_type:2;
GLuint pad1:4;
GLuint header_present:1;
} cre_gen75;
struct {
GLuint pad:19;
GLuint header_present:1;
GLuint response_length:5;
GLuint msg_length:4;
GLuint pad1:2;
GLuint end_of_thread:1;
} generic_gen5;
GLuint ud;
GLint id;
GLfloat fd;
} bits3;
char *first_reloc_target, *second_reloc_target; // first for JIP, second for UIP
GLint first_reloc_offset, second_reloc_offset; // in number of instructions
};
#endif