/************************************************************************** * * 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; /* 0x0000007f */ GLuint pad:1; /* 0x00000080 */ /* reserved for Opcode */ GLuint access_mode:1; /* 0x00000100 */ GLuint mask_control:1; /* 0x00000200 */ GLuint dependency_control:2; /* 0x00000c00 */ GLuint compression_control:2; /* 0x00003000 */ GLuint thread_control:2; /* 0x0000c000 */ GLuint predicate_control:4; /* 0x000f0000 */ GLuint predicate_inverse:1; /* 0x00100000 */ GLuint execution_size:3; /* 0x00e00000 */ GLuint sfid_destreg__conditionalmod:4; /* sfid - send on GEN6+, destreg - send on Prev GEN6, conditionalmod - others */ GLuint acc_wr_control:1; /* 0x10000000 */ GLuint pad0:1; /* 0x20000000 */ GLuint debug_control:1; /* 0x40000000 */ GLuint saturate:1; /* 0x80000000 */ } 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; } three_src_gen6; /* Three-source-operator instructions for Gen6+ */ 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 */ } three_src_gen6; /* Three-source-operator instructions for Gen6+ */ 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 */ } three_src_gen6; /* Three-source-operator instructions for Gen6+ */ 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; 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; } dp_read_gen6; 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