lp_context.h revision 1278507e3bf2e83c7027820a0d313de267a440ff
1/**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
29 */
30
31#ifndef LP_CONTEXT_H
32#define LP_CONTEXT_H
33
34#include "pipe/p_context.h"
35
36#include "draw/draw_vertex.h"
37
38#include "lp_tex_sample.h"
39#include "lp_jit.h"
40
41
42struct llvmpipe_vbuf_render;
43struct draw_context;
44struct draw_stage;
45struct llvmpipe_tile_cache;
46struct llvmpipe_tex_tile_cache;
47struct lp_fragment_shader;
48struct lp_vertex_shader;
49struct lp_blend_state;
50
51
52struct llvmpipe_context {
53   struct pipe_context pipe;  /**< base class */
54
55   /** Constant state objects */
56   const struct pipe_blend_state *blend;
57   const struct pipe_sampler_state *sampler[PIPE_MAX_SAMPLERS];
58   struct pipe_sampler_state *vertex_samplers[PIPE_MAX_VERTEX_SAMPLERS];
59   const struct pipe_depth_stencil_alpha_state *depth_stencil;
60   const struct pipe_rasterizer_state *rasterizer;
61   struct lp_fragment_shader *fs;
62   const struct lp_vertex_shader *vs;
63
64   /** Other rendering state */
65   struct pipe_blend_color blend_color[4][16];
66   struct pipe_clip_state clip;
67   struct pipe_buffer *constants[PIPE_SHADER_TYPES];
68   struct pipe_framebuffer_state framebuffer;
69   struct pipe_poly_stipple poly_stipple;
70   struct pipe_scissor_state scissor;
71   struct pipe_texture *texture[PIPE_MAX_SAMPLERS];
72   struct pipe_texture *vertex_textures[PIPE_MAX_VERTEX_SAMPLERS];
73   struct pipe_viewport_state viewport;
74   struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
75   struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
76
77   unsigned num_samplers;
78   unsigned num_textures;
79   unsigned num_vertex_samplers;
80   unsigned num_vertex_textures;
81   unsigned num_vertex_elements;
82   unsigned num_vertex_buffers;
83
84   unsigned dirty; /**< Mask of LP_NEW_x flags */
85
86   /* Counter for occlusion queries.  Note this supports overlapping
87    * queries.
88    */
89   uint64_t occlusion_count;
90   unsigned active_query_count;
91
92   /** Mapped vertex buffers */
93   ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];
94
95   /** Vertex format */
96   struct vertex_info vertex_info;
97   struct vertex_info vertex_info_vbuf;
98
99   /** Which vertex shader output slot contains point size */
100   int psize_slot;
101
102   /* The reduced version of the primitive supplied by the state
103    * tracker.
104    */
105   unsigned reduced_api_prim;
106
107   /* The reduced primitive after unfilled triangles, wide-line
108    * decomposition, etc, are taken into account.  This is the
109    * primitive actually rasterized.
110    */
111   unsigned reduced_prim;
112
113   /** Derived from scissor and surface bounds: */
114   struct pipe_scissor_state cliprect;
115
116   unsigned line_stipple_counter;
117
118   /** TGSI exec things */
119   struct {
120      struct lp_shader_sampler vert_samplers[PIPE_MAX_SAMPLERS];
121      struct lp_shader_sampler *vert_samplers_list[PIPE_MAX_SAMPLERS];
122      struct lp_shader_sampler frag_samplers[PIPE_MAX_SAMPLERS];
123      struct lp_shader_sampler *frag_samplers_list[PIPE_MAX_SAMPLERS];
124   } tgsi;
125
126   /** The primitive drawing context */
127   struct draw_context *draw;
128
129   /** Draw module backend */
130   struct vbuf_render *vbuf_backend;
131   struct draw_stage *vbuf;
132
133   boolean dirty_render_cache;
134
135   struct llvmpipe_tile_cache *cbuf_cache[PIPE_MAX_COLOR_BUFS];
136
137   /* TODO: we shouldn't be using external interfaces internally like this */
138   struct pipe_transfer *zsbuf_transfer;
139   uint8_t *zsbuf_map;
140
141   unsigned tex_timestamp;
142   struct llvmpipe_tex_tile_cache *tex_cache[PIPE_MAX_SAMPLERS];
143   struct llvmpipe_tex_tile_cache *vertex_tex_cache[PIPE_MAX_VERTEX_SAMPLERS];
144
145   unsigned no_rast : 1;
146
147   struct lp_jit_context jit_context;
148};
149
150
151static INLINE struct llvmpipe_context *
152llvmpipe_context( struct pipe_context *pipe )
153{
154   return (struct llvmpipe_context *)pipe;
155}
156
157#endif /* LP_CONTEXT_H */
158
159