X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_vs.h;h=2c085474733b40acda1a2db53c37a215fbe2561d;hb=403bb1d306c5bc23ad9e2c26fd39071e6e41f665;hp=95e0501b1ebb3262bfb12936401aa56040b4b0cc;hpb=5e8240320ac39a3e8984054bc300743725312741;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h index 95e0501b1eb..2c085474733 100644 --- a/src/mesa/drivers/dri/i965/brw_vs.h +++ b/src/mesa/drivers/dri/i965/brw_vs.h @@ -36,14 +36,60 @@ #include "brw_context.h" #include "brw_eu.h" -#include "shader/program.h" - +#include "brw_program.h" +#include "program/program.h" + +/** + * The VF can't natively handle certain types of attributes, such as GL_FIXED + * or most 10_10_10_2 types. These flags enable various VS workarounds to + * "fix" attributes at the beginning of shaders. + */ +#define BRW_ATTRIB_WA_COMPONENT_MASK 7 /* mask for GL_FIXED scale channel count */ +#define BRW_ATTRIB_WA_NORMALIZE 8 /* normalize in shader */ +#define BRW_ATTRIB_WA_BGRA 16 /* swap r/b channels in shader */ +#define BRW_ATTRIB_WA_SIGN 32 /* interpret as signed in shader */ +#define BRW_ATTRIB_WA_SCALE 64 /* interpret as scaled in shader */ struct brw_vs_prog_key { GLuint program_string_id; - GLuint nr_userclip:4; + + /* + * Per-attribute workaround flags + */ + uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX]; + + /** + * True if at least one clip flag is enabled, regardless of whether the + * shader uses clip planes or gl_ClipDistance. + */ + GLuint userclip_active:1; + + /** + * How many user clipping planes are being uploaded to the vertex shader as + * push constants. + */ + GLuint nr_userclip_plane_consts:4; + + /** + * True if the shader uses gl_ClipDistance, regardless of whether any clip + * flags are enabled. + */ + GLuint uses_clip_distance:1; + + /** + * For pre-Gen6 hardware, a bitfield indicating which clipping planes are + * enabled. This is used to compact clip planes. + * + * For Gen6 and later hardware, clip planes are not compacted, so this + * value is zero to avoid provoking unnecessary shader recompiles. + */ + GLuint userclip_planes_enabled_gen_4_5:MAX_CLIP_PLANES; + GLuint copy_edgeflag:1; - GLuint pad:26; + GLuint point_coord_replace:8; + GLuint clamp_vertex_color:1; + + struct brw_sampler_prog_key_data tex; }; @@ -51,41 +97,21 @@ struct brw_vs_compile { struct brw_compile func; struct brw_vs_prog_key key; struct brw_vs_prog_data prog_data; - int8_t constant_map[1024]; struct brw_vertex_program *vp; - GLuint nr_inputs; - - GLuint first_output; - GLuint nr_outputs; - GLuint first_overflow_output; /**< VERT_ATTRIB_x */ - - GLuint first_tmp; - GLuint last_tmp; - - struct brw_reg r0; - struct brw_reg r1; - struct brw_reg regs[PROGRAM_ADDRESS+1][128]; - struct brw_reg tmp; - struct brw_reg stack; - - struct { - GLboolean used_in_src; - struct brw_reg reg; - } output_regs[128]; - - struct brw_reg userplane[6]; - - /** we may need up to 3 constants per instruction (if use_const_buffer) */ - struct { - GLint index; - struct brw_reg reg; - } current_const[3]; - - GLboolean needs_stack; + GLuint last_scratch; /**< measured in 32-byte (register size) units */ }; -void brw_vs_emit( struct brw_vs_compile *c ); +bool brw_vs_emit(struct brw_context *brw, + struct gl_shader_program *prog, + struct brw_vs_compile *c); +bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog); +void brw_vs_debug_recompile(struct brw_context *brw, + struct gl_shader_program *prog, + const struct brw_vs_prog_key *key); +bool brw_vs_prog_data_compare(const void *a, const void *b, + int aux_size, const void *key); +void brw_vs_prog_data_free(const void *in_prog_data); #endif