1#ifndef __NV30_CONTEXT_H__ 2#define __NV30_CONTEXT_H__ 3 4#include "pipe/p_format.h" 5#include "util/u_blitter.h" 6 7#include "nv30/nv30_screen.h" 8#include "nv30/nv30_state.h" 9 10#include "nouveau_context.h" 11 12#define BUFCTX_FB 0 13#define BUFCTX_VTXTMP 1 14#define BUFCTX_VTXBUF 2 15#define BUFCTX_IDXBUF 3 16#define BUFCTX_VERTTEX(n) (4 + (n)) 17#define BUFCTX_FRAGPROG 8 18#define BUFCTX_FRAGTEX(n) (9 + (n)) 19 20#define NV30_NEW_BLEND (1 << 0) 21#define NV30_NEW_RASTERIZER (1 << 1) 22#define NV30_NEW_ZSA (1 << 2) 23#define NV30_NEW_VERTPROG (1 << 3) 24#define NV30_NEW_VERTCONST (1 << 4) 25#define NV30_NEW_FRAGPROG (1 << 5) 26#define NV30_NEW_FRAGCONST (1 << 6) 27#define NV30_NEW_BLEND_COLOUR (1 << 7) 28#define NV30_NEW_STENCIL_REF (1 << 8) 29#define NV30_NEW_CLIP (1 << 9) 30#define NV30_NEW_SAMPLE_MASK (1 << 10) 31#define NV30_NEW_FRAMEBUFFER (1 << 11) 32#define NV30_NEW_STIPPLE (1 << 12) 33#define NV30_NEW_SCISSOR (1 << 13) 34#define NV30_NEW_VIEWPORT (1 << 14) 35#define NV30_NEW_ARRAYS (1 << 15) 36#define NV30_NEW_VERTEX (1 << 16) 37#define NV30_NEW_CONSTBUF (1 << 17) 38#define NV30_NEW_FRAGTEX (1 << 18) 39#define NV30_NEW_VERTTEX (1 << 19) 40#define NV30_NEW_SWTNL (1 << 31) 41#define NV30_NEW_ALL 0x000fffff 42 43struct nv30_context { 44 struct nouveau_context base; 45 struct nv30_screen *screen; 46 struct blitter_context *blitter; 47 48 struct nouveau_bufctx *bufctx; 49 50 struct { 51 unsigned rt_enable; 52 unsigned scissor_off; 53 unsigned num_vtxelts; 54 int index_bias; 55 bool prim_restart; 56 struct nv30_fragprog *fragprog; 57 } state; 58 59 uint32_t dirty; 60 61 struct draw_context *draw; 62 uint32_t draw_flags; 63 uint32_t draw_dirty; 64 65 struct nv30_blend_stateobj *blend; 66 struct nv30_rasterizer_stateobj *rast; 67 struct nv30_zsa_stateobj *zsa; 68 struct nv30_vertex_stateobj *vertex; 69 70 struct { 71 unsigned filter; 72 unsigned aniso; 73 } config; 74 75 struct { 76 struct nv30_vertprog *program; 77 78 struct pipe_resource *constbuf; 79 unsigned constbuf_nr; 80 81 struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; 82 unsigned num_textures; 83 struct nv30_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 84 unsigned num_samplers; 85 unsigned dirty_samplers; 86 } vertprog; 87 88 struct { 89 struct nv30_fragprog *program; 90 91 struct pipe_resource *constbuf; 92 unsigned constbuf_nr; 93 94 struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; 95 unsigned num_textures; 96 struct nv30_sampler_state *samplers[PIPE_MAX_SAMPLERS]; 97 unsigned num_samplers; 98 unsigned dirty_samplers; 99 } fragprog; 100 101 struct pipe_framebuffer_state framebuffer; 102 struct pipe_blend_color blend_colour; 103 struct pipe_stencil_ref stencil_ref; 104 struct pipe_poly_stipple stipple; 105 struct pipe_scissor_state scissor; 106 struct pipe_viewport_state viewport; 107 struct pipe_clip_state clip; 108 109 unsigned sample_mask; 110 111 struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; 112 unsigned num_vtxbufs; 113 uint32_t vbo_fifo; 114 uint32_t vbo_user; 115 unsigned vbo_min_index; 116 unsigned vbo_max_index; 117 bool vbo_push_hint; 118 119 struct nouveau_heap *blit_vp; 120 struct pipe_resource *blit_fp; 121 122 struct pipe_query *render_cond_query; 123 unsigned render_cond_mode; 124 bool render_cond_cond; 125}; 126 127static inline struct nv30_context * 128nv30_context(struct pipe_context *pipe) 129{ 130 return (struct nv30_context *)pipe; 131} 132 133struct pipe_context * 134nv30_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags); 135 136void 137nv30_vbo_init(struct pipe_context *pipe); 138 139void 140nv30_vbo_validate(struct nv30_context *nv30); 141 142void 143nv30_query_init(struct pipe_context *pipe); 144 145void 146nv30_state_init(struct pipe_context *pipe); 147 148void 149nv30_clear_init(struct pipe_context *pipe); 150 151void 152nv30_vertprog_init(struct pipe_context *pipe); 153 154void 155nv30_vertprog_validate(struct nv30_context *nv30); 156 157void 158nv30_fragprog_init(struct pipe_context *pipe); 159 160void 161nv30_fragprog_validate(struct nv30_context *nv30); 162 163void 164nv30_texture_init(struct pipe_context *pipe); 165 166void 167nv30_texture_validate(struct nv30_context *nv30); 168 169void 170nv30_fragtex_init(struct pipe_context *pipe); 171 172void 173nv30_fragtex_validate(struct nv30_context *nv30); 174 175void 176nv40_verttex_init(struct pipe_context *pipe); 177 178void 179nv40_verttex_validate(struct nv30_context *nv30); 180 181void 182nv30_fragtex_sampler_states_bind(struct pipe_context *pipe, 183 unsigned nr, void **hwcso); 184 185void 186nv40_verttex_sampler_states_bind(struct pipe_context *pipe, 187 unsigned nr, void **hwcso); 188 189void 190nv40_verttex_set_sampler_views(struct pipe_context *pipe, unsigned nr, 191 bool take_ownership, 192 struct pipe_sampler_view **views); 193 194void 195nv30_fragtex_set_sampler_views(struct pipe_context *pipe, 196 unsigned nr, bool take_ownership, 197 struct pipe_sampler_view **views); 198 199void 200nv30_push_vbo(struct nv30_context *nv30, const struct pipe_draw_info *info, 201 const struct pipe_draw_start_count_bias *draw); 202 203void 204nv30_draw_init(struct pipe_context *pipe); 205 206void 207nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info, 208 unsigned drawid_offset, 209 const struct pipe_draw_start_count_bias *draw); 210 211bool 212nv30_state_validate(struct nv30_context *nv30, uint32_t mask, bool hwtnl); 213 214void 215nv30_state_release(struct nv30_context *nv30); 216 217#ifdef NV30_3D_VERTEX_BEGIN_END 218#define NV30_PRIM_GL_CASE(n) \ 219 case PIPE_PRIM_##n: return NV30_3D_VERTEX_BEGIN_END_##n 220 221static inline unsigned 222nv30_prim_gl(unsigned prim) 223{ 224 switch (prim) { 225 NV30_PRIM_GL_CASE(POINTS); 226 NV30_PRIM_GL_CASE(LINES); 227 NV30_PRIM_GL_CASE(LINE_LOOP); 228 NV30_PRIM_GL_CASE(LINE_STRIP); 229 NV30_PRIM_GL_CASE(TRIANGLES); 230 NV30_PRIM_GL_CASE(TRIANGLE_STRIP); 231 NV30_PRIM_GL_CASE(TRIANGLE_FAN); 232 NV30_PRIM_GL_CASE(QUADS); 233 NV30_PRIM_GL_CASE(QUAD_STRIP); 234 NV30_PRIM_GL_CASE(POLYGON); 235 default: 236 return NV30_3D_VERTEX_BEGIN_END_POINTS; 237 break; 238 } 239} 240#endif 241 242#endif 243