X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_program.h;h=87ac3388d7276c81a6498763190d906b8e46caa7;hb=a398a9d7e7f8fe19eaa0c33b36ab6816472b698c;hp=33d39f005b91c7cbc7643c5faf15ff15ff2a7946;hpb=de6a004035f3de5879648f8afb4670ae82f4ad02;p=mesa.git diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 33d39f005b9..87ac3388d72 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -35,17 +35,78 @@ #define ST_PROGRAM_H #include "main/mtypes.h" +#include "main/atifragshader.h" #include "program/program.h" #include "pipe/p_state.h" +#include "tgsi/tgsi_from_mesa.h" #include "st_context.h" +#include "st_texture.h" #include "st_glsl_to_tgsi.h" - #ifdef __cplusplus extern "C" { #endif -#define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xffffffff +#define ST_DOUBLE_ATTRIB_PLACEHOLDER 0xff + +struct st_external_sampler_key +{ + GLuint lower_nv12; /**< bitmask of 2 plane YUV samplers */ + GLuint lower_iyuv; /**< bitmask of 3 plane YUV samplers */ + GLuint lower_xy_uxvx; /**< bitmask of 2 plane YUV samplers */ + GLuint lower_yx_xuxv; /**< bitmask of 2 plane YUV samplers */ + GLuint lower_ayuv; + GLuint lower_xyuv; +}; + +static inline struct st_external_sampler_key +st_get_external_sampler_key(struct st_context *st, struct gl_program *prog) +{ + unsigned mask = prog->ExternalSamplersUsed; + struct st_external_sampler_key key; + + memset(&key, 0, sizeof(key)); + + while (unlikely(mask)) { + unsigned unit = u_bit_scan(&mask); + struct st_texture_object *stObj = + st_get_texture_object(st->ctx, prog, unit); + enum pipe_format format = st_get_view_format(stObj); + + /* if resource format matches then YUV wasn't lowered */ + if (format == stObj->pt->format) + continue; + + switch (format) { + case PIPE_FORMAT_NV12: + case PIPE_FORMAT_P010: + case PIPE_FORMAT_P016: + key.lower_nv12 |= (1 << unit); + break; + case PIPE_FORMAT_IYUV: + key.lower_iyuv |= (1 << unit); + break; + case PIPE_FORMAT_YUYV: + key.lower_yx_xuxv |= (1 << unit); + break; + case PIPE_FORMAT_UYVY: + key.lower_xy_uxvx |= (1 << unit); + break; + case PIPE_FORMAT_AYUV: + key.lower_ayuv |= (1 << unit); + break; + case PIPE_FORMAT_XYUV: + key.lower_xyuv |= (1 << unit); + break; + default: + printf("mesa: st_get_external_sampler_key: unhandled pipe format %u\n", + format); + break; + } + } + + return key; +} /** Fragment program variant key */ struct st_fp_variant_key @@ -65,297 +126,163 @@ struct st_fp_variant_key /** for ARB_sample_shading */ GLuint persample_shading:1; -}; + /** needed for ATI_fragment_shader */ + GLuint fog:2; -/** - * Variant of a fragment program. - */ -struct st_fp_variant -{ - /** Parameters which generated this version of fragment program */ - struct st_fp_variant_key key; + /** for ARB_depth_clamp */ + GLuint lower_depth_clamp:1; - struct pipe_shader_state tgsi; + /** for OpenGL 1.0 on modern hardware */ + GLuint lower_two_sided_color:1; - /** Driver's compiled shader */ - void *driver_shader; + GLuint lower_flatshade:1; + enum compare_func lower_alpha_func:3; - /** For glBitmap variants */ - struct gl_program_parameter_list *parameters; - uint bitmap_sampler; - - /** For glDrawPixels variants */ - unsigned drawpix_sampler; - unsigned pixelmap_sampler; - - /** next in linked list */ - struct st_fp_variant *next; -}; - - -/** - * Derived from Mesa gl_fragment_program: - */ -struct st_fragment_program -{ - struct gl_fragment_program Base; - struct glsl_to_tgsi_visitor* glsl_to_tgsi; - - struct st_fp_variant *variants; -}; - - - -/** Vertex program variant key */ -struct st_vp_variant_key -{ - struct st_context *st; /**< variants are per-context */ - boolean passthrough_edgeflags; + /** needed for ATI_fragment_shader */ + char texture_targets[MAX_NUM_FRAGMENT_REGISTERS_ATI]; - /** for ARB_color_buffer_float */ - boolean clamp_color; + struct st_external_sampler_key external; }; - /** - * This represents a vertex program, especially translated to match - * the inputs of a particular fragment shader. + * Base class for shader variants. */ -struct st_vp_variant +struct st_variant { - /* Parameters which generated this translated version of a vertex - * shader: - */ - struct st_vp_variant_key key; + /** next in linked list */ + struct st_variant *next; - /** - * TGSI tokens (to later generate a 'draw' module shader for - * selection/feedback/rasterpos) - */ - struct pipe_shader_state tgsi; + /** st_context from the shader key */ + struct st_context *st; - /** Driver's compiled shader */ void *driver_shader; - - /** For using our private draw module (glRasterPos) */ - struct draw_vertex_shader *draw_shader; - - /** Next in linked list */ - struct st_vp_variant *next; - - /** similar to that in st_vertex_program, but with edgeflags info too */ - GLuint num_inputs; }; - /** - * Derived from Mesa gl_fragment_program: + * Variant of a fragment program. */ -struct st_vertex_program +struct st_fp_variant { - struct gl_vertex_program Base; /**< The Mesa vertex program */ - struct glsl_to_tgsi_visitor* glsl_to_tgsi; + struct st_variant base; - /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */ - /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */ - GLuint index_to_input[PIPE_MAX_SHADER_INPUTS]; - GLuint num_inputs; + /** Parameters which generated this version of fragment program */ + struct st_fp_variant_key key; - /** Maps VARYING_SLOT_x to slot */ - GLuint result_to_output[VARYING_SLOT_MAX]; + /** For glBitmap variants */ + uint bitmap_sampler; - /** List of translated variants of this vertex program. - */ - struct st_vp_variant *variants; + /** For glDrawPixels variants */ + unsigned drawpix_sampler; + unsigned pixelmap_sampler; }; - -/** Geometry program variant key */ -struct st_gp_variant_key +/** Shader key shared by other shaders */ +struct st_common_variant_key { struct st_context *st; /**< variants are per-context */ - /* no other fields yet */ -}; - + bool passthrough_edgeflags; -/** - * Geometry program variant. - */ -struct st_gp_variant -{ - /* Parameters which generated this variant. */ - struct st_gp_variant_key key; - - void *driver_shader; - - struct st_gp_variant *next; -}; - - -/** - * Derived from Mesa gl_geometry_program: - */ -struct st_geometry_program -{ - struct gl_geometry_program Base; /**< The Mesa geometry program */ - struct glsl_to_tgsi_visitor* glsl_to_tgsi; + /** for ARB_color_buffer_float */ + bool clamp_color; - struct st_gp_variant *variants; -}; + /** both for ARB_depth_clamp */ + bool lower_depth_clamp; + bool clip_negative_one_to_one; + /** lower glPointSize to gl_PointSize */ + boolean lower_point_size; + /* for user-defined clip-planes */ + uint8_t lower_ucp; -/** Tessellation control program variant key */ -struct st_tcp_variant_key -{ - struct st_context *st; /**< variants are per-context */ - /* no other fields yet */ + /* Whether st_variant::driver_shader is for the draw module, + * not for the driver. + */ + bool is_draw_shader; }; /** - * Tessellation control program variant. + * Common shader variant. */ -struct st_tcp_variant +struct st_common_variant { - /* Parameters which generated this variant. */ - struct st_tcp_variant_key key; + struct st_variant base; - void *driver_shader; + /* Parameters which generated this variant. */ + struct st_common_variant_key key; - struct st_tcp_variant *next; + /* Bitfield of VERT_BIT_* bits matching vertex shader inputs, + * but not include the high part of doubles. + */ + GLbitfield vert_attrib_mask; }; /** - * Derived from Mesa gl_tess_ctrl_program: + * Derived from Mesa gl_program: */ -struct st_tessctrl_program +struct st_program { - struct gl_tess_ctrl_program Base; /**< The Mesa tess ctrl program */ + struct gl_program Base; + struct pipe_shader_state state; struct glsl_to_tgsi_visitor* glsl_to_tgsi; + struct ati_fragment_shader *ati_fs; + uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */ - struct st_tcp_variant *variants; -}; - + void *serialized_nir; + unsigned serialized_nir_size; + /* used when bypassing glsl_to_tgsi: */ + struct gl_shader_program *shader_program; -/** Tessellation evaluation program variant key */ -struct st_tep_variant_key -{ - struct st_context *st; /**< variants are per-context */ - /* no other fields yet */ + struct st_variant *variants; }; -/** - * Tessellation evaluation program variant. - */ -struct st_tep_variant +struct st_vertex_program { - /* Parameters which generated this variant. */ - struct st_tep_variant_key key; + struct st_program Base; - void *driver_shader; - - struct st_tep_variant *next; -}; - - -/** - * Derived from Mesa gl_tess_eval_program: - */ -struct st_tesseval_program -{ - struct gl_tess_eval_program Base; /**< The Mesa tess eval program */ - struct glsl_to_tgsi_visitor* glsl_to_tgsi; + /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */ + ubyte index_to_input[PIPE_MAX_ATTRIBS]; + ubyte num_inputs; + /** Reverse mapping of the above */ + ubyte input_to_index[VERT_ATTRIB_MAX]; - struct st_tep_variant *variants; + /** Maps VARYING_SLOT_x to slot */ + ubyte result_to_output[VARYING_SLOT_MAX]; }; - -static inline struct st_fragment_program * -st_fragment_program( struct gl_fragment_program *fp ) -{ - return (struct st_fragment_program *)fp; -} - - -static inline struct st_vertex_program * -st_vertex_program( struct gl_vertex_program *vp ) -{ - return (struct st_vertex_program *)vp; -} - -static inline struct st_geometry_program * -st_geometry_program( struct gl_geometry_program *gp ) -{ - return (struct st_geometry_program *)gp; -} - -static inline struct st_tessctrl_program * -st_tessctrl_program( struct gl_tess_ctrl_program *tcp ) -{ - return (struct st_tessctrl_program *)tcp; -} - -static inline struct st_tesseval_program * -st_tesseval_program( struct gl_tess_eval_program *tep ) +static inline struct st_program * +st_program( struct gl_program *cp ) { - return (struct st_tesseval_program *)tep; -} - -static inline void -st_reference_vertprog(struct st_context *st, - struct st_vertex_program **ptr, - struct st_vertex_program *prog) -{ - _mesa_reference_program(st->ctx, - (struct gl_program **) ptr, - (struct gl_program *) prog); + return (struct st_program *)cp; } static inline void -st_reference_geomprog(struct st_context *st, - struct st_geometry_program **ptr, - struct st_geometry_program *prog) +st_reference_prog(struct st_context *st, + struct st_program **ptr, + struct st_program *prog) { _mesa_reference_program(st->ctx, (struct gl_program **) ptr, (struct gl_program *) prog); } -static inline void -st_reference_fragprog(struct st_context *st, - struct st_fragment_program **ptr, - struct st_fragment_program *prog) +static inline struct st_common_variant * +st_common_variant(struct st_variant *v) { - _mesa_reference_program(st->ctx, - (struct gl_program **) ptr, - (struct gl_program *) prog); + return (struct st_common_variant*)v; } -static inline void -st_reference_tesscprog(struct st_context *st, - struct st_tessctrl_program **ptr, - struct st_tessctrl_program *prog) +static inline struct st_fp_variant * +st_fp_variant(struct st_variant *v) { - _mesa_reference_program(st->ctx, - (struct gl_program **) ptr, - (struct gl_program *) prog); -} - -static inline void -st_reference_tesseprog(struct st_context *st, - struct st_tesseval_program **ptr, - struct st_tesseval_program *prog) -{ - _mesa_reference_program(st->ctx, - (struct gl_program **) ptr, - (struct gl_program *) prog); + return (struct st_fp_variant*)v; } /** @@ -364,83 +291,61 @@ st_reference_tesseprog(struct st_context *st, static inline unsigned st_get_generic_varying_index(struct st_context *st, GLuint attr) { - if (attr >= VARYING_SLOT_VAR0) { - if (st->needs_texcoord_semantic) - return attr - VARYING_SLOT_VAR0; - else - return 9 + (attr - VARYING_SLOT_VAR0); - } - if (attr == VARYING_SLOT_PNTC) { - assert(!st->needs_texcoord_semantic); - return 8; - } - if (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7) { - assert(!st->needs_texcoord_semantic); - return attr - VARYING_SLOT_TEX0; - } - - assert(0); - return 0; + return tgsi_get_generic_gl_varying_index((gl_varying_slot)attr, + st->needs_texcoord_semantic); } +extern void +st_set_prog_affected_state_flags(struct gl_program *prog); -extern struct st_vp_variant * +extern struct st_common_variant * st_get_vp_variant(struct st_context *st, - struct st_vertex_program *stvp, - const struct st_vp_variant_key *key); + struct st_program *stvp, + const struct st_common_variant_key *key); extern struct st_fp_variant * st_get_fp_variant(struct st_context *st, - struct st_fragment_program *stfp, + struct st_program *stfp, const struct st_fp_variant_key *key); - -extern struct st_gp_variant * -st_get_gp_variant(struct st_context *st, - struct st_geometry_program *stgp, - const struct st_gp_variant_key *key); - -extern struct st_tcp_variant * -st_get_tcp_variant(struct st_context *st, - struct st_tessctrl_program *stgp, - const struct st_tcp_variant_key *key); - -extern struct st_tep_variant * -st_get_tep_variant(struct st_context *st, - struct st_tesseval_program *stgp, - const struct st_tep_variant_key *key); +extern struct st_variant * +st_get_common_variant(struct st_context *st, + struct st_program *p, + const struct st_common_variant_key *key); extern void -st_release_vp_variants( struct st_context *st, - struct st_vertex_program *stvp ); +st_release_variants(struct st_context *st, struct st_program *p); extern void -st_release_fp_variants( struct st_context *st, - struct st_fragment_program *stfp ); +st_destroy_program_variants(struct st_context *st); extern void -st_release_gp_variants(struct st_context *st, - struct st_geometry_program *stgp); +st_finalize_nir_before_variants(struct nir_shader *nir); extern void -st_release_tcp_variants(struct st_context *st, - struct st_tessctrl_program *stgp); +st_prepare_vertex_program(struct st_program *stvp); extern void -st_release_tep_variants(struct st_context *st, - struct st_tesseval_program *stgp); +st_translate_stream_output_info(struct gl_program *prog); -extern void -st_destroy_program_variants(struct st_context *st); +extern bool +st_translate_vertex_program(struct st_context *st, + struct st_program *stvp); + +extern bool +st_translate_fragment_program(struct st_context *st, + struct st_program *stfp); +extern bool +st_translate_common_program(struct st_context *st, + struct st_program *stp); extern void -st_print_current_vertex_program(void); +st_serialize_nir(struct st_program *stp); extern void -st_precompile_shader_variant(struct st_context *st, - struct gl_program *prog); +st_finalize_program(struct st_context *st, struct gl_program *prog); #ifdef __cplusplus }