X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_private.h;h=ba93b09337753508e413aca2ca075a25d6a96265;hb=662a4d4a120cb0a07023f00e3c5e4a0809428a53;hp=c0ef18e3ed2ab57ef26f0064f24fd0c3b8404f6a;hpb=dc4c821f0817a3db716f965692fb701079f66340;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index c0ef18e3ed2..ba93b093377 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -47,14 +47,18 @@ #include "tgsi/tgsi_scan.h" #ifdef HAVE_LLVM -#include struct draw_llvm; +struct gallivm_state; #endif /** Sum of frustum planes and user-defined planes */ #define DRAW_TOTAL_CLIP_PLANES (6 + PIPE_MAX_CLIP_PLANES) +/** + * The largest possible index of a vertex that can be fetched. + */ +#define DRAW_MAX_FETCH_IDX 0xffffffff struct pipe_context; struct draw_vertex_shader; @@ -63,7 +67,17 @@ struct draw_stage; struct vbuf_render; struct tgsi_exec_machine; struct tgsi_sampler; +struct draw_pt_front_end; +struct draw_assembler; + +/** + * Represents the mapped vertex buffer. + */ +struct draw_vertex_buffer { + const void *map; + uint32_t size; +}; /** * Basic vertex info. @@ -72,10 +86,11 @@ struct tgsi_sampler; struct vertex_header { unsigned clipmask:DRAW_TOTAL_CLIP_PLANES; unsigned edgeflag:1; - unsigned pad:1; + unsigned have_clipdist:1; unsigned vertex_id:16; float clip[4]; + float pre_clip_pos[4]; /* This will probably become float (*data)[4] soon: */ @@ -136,6 +151,14 @@ struct draw_context /* Support prototype passthrough path: */ struct { + /* Current active frontend */ + struct draw_pt_front_end *frontend; + unsigned prim; + unsigned opt; /**< bitmask of PT_x flags */ + unsigned eltSize; /* saved eltSize for flushing */ + + boolean rebind_parameters; + struct { struct draw_pt_middle_end *fetch_emit; struct draw_pt_middle_end *fetch_shade_emit; @@ -161,20 +184,20 @@ struct draw_context struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS]; unsigned nr_vertex_elements; - struct pipe_index_buffer index_buffer; - /* user-space vertex data, buffers */ struct { /** vertex element/index buffer (ex: glDrawElements) */ const void *elts; /** bytes per index (0, 1, 2 or 4) */ + unsigned eltSizeIB; unsigned eltSize; - int eltBias; + unsigned eltMax; + int eltBias; unsigned min_index; unsigned max_index; /** vertex arrays */ - const void *vbuffer[PIPE_MAX_ATTRIBS]; + struct draw_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS]; /** constant buffers (for vertex/geometry shader) */ const void *vs_constants[PIPE_MAX_CONSTANT_BUFFERS]; @@ -196,6 +219,8 @@ struct draw_context boolean guard_band_xy; } driver; + boolean quads_always_flatshade_last; + boolean flushing; /**< debugging/sanity */ boolean suspend_flushing; /**< internally set */ @@ -221,7 +246,7 @@ struct draw_context /** Rasterizer CSOs without culling/stipple/etc */ void *rasterizer_no_cull[2][2]; - struct pipe_viewport_state viewport; + struct pipe_viewport_state viewports[PIPE_MAX_VIEWPORTS]; boolean identity_viewport; /** Vertex shader state */ @@ -230,19 +255,15 @@ struct draw_context uint num_vs_outputs; /**< convenience, from vertex_shader */ uint position_output; uint edgeflag_output; + uint clipvertex_output; + uint clipdistance_output[2]; - /** TGSI program interpreter runtime state */ - struct tgsi_exec_machine *machine; - - uint num_samplers; - struct tgsi_sampler **samplers; - - - const void *aligned_constants[PIPE_MAX_CONSTANT_BUFFERS]; - - const void *aligned_constant_storage[PIPE_MAX_CONSTANT_BUFFERS]; - unsigned const_storage_size[PIPE_MAX_CONSTANT_BUFFERS]; + /** Fields for TGSI interpreter / execution */ + struct { + struct tgsi_exec_machine *machine; + struct tgsi_sampler *sampler; + } tgsi; struct translate *fetch; struct translate_cache *fetch_cache; @@ -256,11 +277,13 @@ struct draw_context uint num_gs_outputs; /**< convenience, from geometry_shader */ uint position_output; - /** TGSI program interpreter runtime state */ - struct tgsi_exec_machine *machine; + /** Fields for TGSI interpreter / execution */ + struct { + struct tgsi_exec_machine *machine; + + struct tgsi_sampler *sampler; + } tgsi; - uint num_samplers; - struct tgsi_sampler **samplers; } gs; /** Fragment shader state */ @@ -270,9 +293,8 @@ struct draw_context /** Stream output (vertex feedback) state */ struct { - struct pipe_stream_output_info state; - void *buffers[PIPE_MAX_SO_BUFFERS]; - uint num_buffers; + struct draw_so_target *targets[PIPE_MAX_SO_BUFFERS]; + uint num_targets; } so; /* Clip derived state: @@ -288,19 +310,28 @@ struct draw_context uint slot[10]; } extra_shader_outputs; - unsigned reduced_prim; - unsigned instance_id; + unsigned start_instance; + unsigned start_index; #ifdef HAVE_LLVM struct draw_llvm *llvm; - struct gallivm_state *own_gallivm; #endif - struct pipe_sampler_view *sampler_views[PIPE_MAX_VERTEX_SAMPLERS]; - unsigned num_sampler_views; - const struct pipe_sampler_state *samplers[PIPE_MAX_VERTEX_SAMPLERS]; - unsigned num_samplers; + /** Texture sampler and sampler view state. + * Note that we have arrays indexed by shader type. At this time + * we only handle vertex and geometry shaders in the draw module, but + * there may be more in the future (ex: hull and tessellation). + */ + struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS]; + unsigned num_sampler_views[PIPE_SHADER_TYPES]; + const struct pipe_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; + unsigned num_samplers[PIPE_SHADER_TYPES]; + + struct pipe_query_data_pipeline_statistics statistics; + boolean collect_statistics; + + struct draw_assembler *ia; void *driver_private; }; @@ -342,6 +373,7 @@ struct draw_prim_info { * Draw common initialization code */ boolean draw_init(struct draw_context *draw); +void draw_new_instance(struct draw_context *draw); /******************************************************************************* * Vertex shader code: @@ -349,27 +381,12 @@ boolean draw_init(struct draw_context *draw); boolean draw_vs_init( struct draw_context *draw ); void draw_vs_destroy( struct draw_context *draw ); -void draw_vs_set_viewport( struct draw_context *, - const struct pipe_viewport_state * ); - -void -draw_vs_set_constants(struct draw_context *, - unsigned slot, - const void *constants, - unsigned size); - - /******************************************************************************* * Geometry shading code: */ boolean draw_gs_init( struct draw_context *draw ); -void -draw_gs_set_constants(struct draw_context *, - unsigned slot, - const void *constants, - unsigned size); void draw_gs_destroy( struct draw_context *draw ); @@ -378,10 +395,17 @@ void draw_gs_destroy( struct draw_context *draw ); */ uint draw_current_shader_outputs(const struct draw_context *draw); uint draw_current_shader_position_output(const struct draw_context *draw); - +uint draw_current_shader_viewport_index_output(const struct draw_context *draw); +uint draw_current_shader_clipvertex_output(const struct draw_context *draw); +uint draw_current_shader_clipdistance_output(const struct draw_context *draw, int index); +uint draw_current_shader_num_written_clipdistances(const struct draw_context *draw); +uint draw_current_shader_culldistance_output(const struct draw_context *draw, int index); +uint draw_current_shader_num_written_culldistances(const struct draw_context *draw); int draw_alloc_extra_vertex_attrib(struct draw_context *draw, uint semantic_name, uint semantic_index); void draw_remove_extra_vertex_attribs(struct draw_context *draw); +boolean draw_current_shader_uses_viewport_index( + const struct draw_context *draw); /******************************************************************************* @@ -390,6 +414,7 @@ void draw_remove_extra_vertex_attribs(struct draw_context *draw); boolean draw_pt_init( struct draw_context *draw ); void draw_pt_destroy( struct draw_context *draw ); void draw_pt_reset_vertex_ids( struct draw_context *draw ); +void draw_pt_flush( struct draw_context *draw, unsigned flags ); /******************************************************************************* @@ -433,8 +458,9 @@ void draw_pipeline_flush( struct draw_context *draw, * Flushing */ -#define DRAW_FLUSH_STATE_CHANGE 0x8 -#define DRAW_FLUSH_BACKEND 0x10 +#define DRAW_FLUSH_PARAMETER_CHANGE 0x1 /**< Constants, viewport, etc */ +#define DRAW_FLUSH_STATE_CHANGE 0x2 /**< Other/heavy state changes */ +#define DRAW_FLUSH_BACKEND 0x4 /**< Flush the output buffer */ void draw_do_flush( struct draw_context *draw, unsigned flags ); @@ -446,5 +472,42 @@ draw_get_rasterizer_no_cull( struct draw_context *draw, boolean scissor, boolean flatshade ); +void +draw_stats_clipper_primitives(struct draw_context *draw, + const struct draw_prim_info *prim_info); + +/** + * Return index i from the index buffer. + * If the index buffer would overflow we return the + * maximum possible index. + */ +#define DRAW_GET_IDX(_elts, _i) \ + (((_i) >= draw->pt.user.eltMax) ? DRAW_MAX_FETCH_IDX : (_elts)[_i]) + +/** + * Return index of the given viewport clamping it + * to be between 0 <= and < PIPE_MAX_VIEWPORTS + */ +static INLINE unsigned +draw_clamp_viewport_idx(int idx) +{ + return ((PIPE_MAX_VIEWPORTS > idx || idx < 0) ? idx : 0); +} + +/** + * Adds two unsigned integers and if the addition + * overflows then it returns the value from + * from the overflow_value variable. + */ +static INLINE unsigned +draw_overflow_uadd(unsigned a, unsigned b, + unsigned overflow_value) +{ + unsigned res = a + b; + if (res < a || res < b) { + res = overflow_value; + } + return res; +} #endif /* DRAW_PRIVATE_H */