X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr600%2Fr600_shader.h;h=cfdb0200333f4067800909d79ea99d0bdf511d62;hb=a6b5845a0d7547198037a2e5ea5c7d3f6f5f9f26;hp=2b8412aa80fc832ced17e95bb69028e4430642b0;hpb=80663cb1859c3398804d720022eebcf9a0df1716;p=mesa.git diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 2b8412aa80f..cfdb0200333 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -25,6 +25,22 @@ #include "r600_asm.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Valid shader configurations: + * + * API shaders VS | TCS | TES | GS |pass| PS + * are compiled as: | | | |thru| + * | | | | | + * Only VS & PS: VS | -- | -- | -- | -- | PS + * With GS: ES | -- | -- | GS | VS | PS + * With Tessel.: LS | HS | VS | -- | -- | PS + * With both: LS | HS | ES | GS | VS | PS + */ + struct r600_shader_io { unsigned name; unsigned gpr; @@ -32,10 +48,12 @@ struct r600_shader_io { int sid; int spi_sid; unsigned interpolate; - boolean centroid; + unsigned ij_index; + unsigned interpolate_location; // TGSI_INTERPOLATE_LOC_CENTER, CENTROID, SAMPLE unsigned lds_pos; /* for evergreen */ - unsigned potential_back_facing_reg; + unsigned back_color_input; unsigned write_mask; + int ring_offset; }; struct r600_shader { @@ -44,8 +62,8 @@ struct r600_shader { unsigned ninput; unsigned noutput; unsigned nlds; - struct r600_shader_io input[32]; - struct r600_shader_io output[32]; + struct r600_shader_io input[64]; + struct r600_shader_io output[64]; boolean uses_kill; boolean fs_write_all; boolean two_side; @@ -57,9 +75,90 @@ struct r600_shader { unsigned nr_ps_color_exports; /* bit n is set if the shader writes gl_ClipDistance[n] */ unsigned clip_dist_write; + boolean vs_position_window_space; /* flag is set if the shader writes VS_OUT_MISC_VEC (e.g. for PSIZE) */ boolean vs_out_misc_write; boolean vs_out_point_size; + boolean vs_out_layer; + boolean vs_out_viewport; + boolean vs_out_edgeflag; + boolean has_txq_cube_array_z_comp; + boolean uses_tex_buffers; + boolean gs_prim_id_input; + + uint8_t ps_conservative_z; + + /* Size in bytes of a data item in the ring(s) (single vertex data). + Stages with only one ring items 123 will be set to 0. */ + unsigned ring_item_sizes[4]; + + unsigned indirect_files; + unsigned max_arrays; + unsigned num_arrays; + unsigned vs_as_es; + unsigned vs_as_ls; + unsigned vs_as_gs_a; + unsigned tes_as_es; + unsigned tcs_prim_mode; + unsigned ps_prim_id_input; + struct r600_shader_array * arrays; + + boolean uses_doubles; }; +union r600_shader_key { + struct { + unsigned nr_cbufs:4; + unsigned color_two_side:1; + unsigned alpha_to_one:1; + } ps; + struct { + unsigned prim_id_out:8; + unsigned as_es:1; /* export shader */ + unsigned as_ls:1; /* local shader */ + unsigned as_gs_a:1; + } vs; + struct { + unsigned as_es:1; + } tes; + struct { + unsigned prim_mode:3; + } tcs; +}; + +struct r600_shader_array { + unsigned gpr_start; + unsigned gpr_count; + unsigned comp_mask; +}; + +struct r600_pipe_shader { + struct r600_pipe_shader_selector *selector; + struct r600_pipe_shader *next_variant; + /* for GS - corresponding copy shader (installed as VS) */ + struct r600_pipe_shader *gs_copy_shader; + struct r600_shader shader; + struct r600_command_buffer command_buffer; /* register writes */ + struct r600_resource *bo; + unsigned sprite_coord_enable; + unsigned flatshade; + unsigned pa_cl_vs_out_cntl; + unsigned nr_ps_color_outputs; + union r600_shader_key key; + unsigned db_shader_control; + unsigned ps_depth_export; + unsigned enabled_stream_buffers_mask; +}; + +/* return the table index 0-5 for TGSI_INTERPOLATE_LINEAR/PERSPECTIVE and + TGSI_INTERPOLATE_LOC_CENTER/SAMPLE/COUNT. Other input values return -1. */ +int eg_get_interpolator_index(unsigned interpolate, unsigned location); + +int r600_get_lds_unique_index(unsigned semantic_name, unsigned index); + +#ifdef __cplusplus +} // extern "C" +#endif + + #endif