#ifndef __NV30_CONTEXT_H__ #define __NV30_CONTEXT_H__ #include "pipe/p_format.h" #include "nv30_screen.h" #include "nv30_state.h" #include "nouveau/nouveau_context.h" #define BUFCTX_FB 0 #define BUFCTX_VTXTMP 1 #define BUFCTX_VTXBUF 2 #define BUFCTX_IDXBUF 3 #define BUFCTX_VERTTEX(n) (4 + (n)) #define BUFCTX_FRAGPROG 8 #define BUFCTX_FRAGTEX(n) (9 + (n)) #define NV30_NEW_BLEND (1 << 0) #define NV30_NEW_RASTERIZER (1 << 1) #define NV30_NEW_ZSA (1 << 2) #define NV30_NEW_VERTPROG (1 << 3) #define NV30_NEW_VERTCONST (1 << 4) #define NV30_NEW_FRAGPROG (1 << 5) #define NV30_NEW_FRAGCONST (1 << 6) #define NV30_NEW_BLEND_COLOUR (1 << 7) #define NV30_NEW_STENCIL_REF (1 << 8) #define NV30_NEW_CLIP (1 << 9) #define NV30_NEW_SAMPLE_MASK (1 << 10) #define NV30_NEW_FRAMEBUFFER (1 << 11) #define NV30_NEW_STIPPLE (1 << 12) #define NV30_NEW_SCISSOR (1 << 13) #define NV30_NEW_VIEWPORT (1 << 14) #define NV30_NEW_ARRAYS (1 << 15) #define NV30_NEW_VERTEX (1 << 16) #define NV30_NEW_CONSTBUF (1 << 17) #define NV30_NEW_FRAGTEX (1 << 18) #define NV30_NEW_VERTTEX (1 << 19) #define NV30_NEW_SWTNL (1 << 31) #define NV30_NEW_ALL 0x000fffff struct nv30_context { struct nouveau_context base; struct nv30_screen *screen; struct nouveau_bufctx *bufctx; struct { unsigned rt_enable; unsigned scissor_off; unsigned num_vtxelts; boolean prim_restart; struct nv30_fragprog *fragprog; } state; uint32_t dirty; struct draw_context *draw; uint32_t draw_flags; uint32_t draw_dirty; struct nv30_blend_stateobj *blend; struct nv30_rasterizer_stateobj *rast; struct nv30_zsa_stateobj *zsa; struct nv30_vertex_stateobj *vertex; struct { unsigned filter; unsigned aniso; } config; struct { struct nv30_vertprog *program; struct pipe_resource *constbuf; unsigned constbuf_nr; struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; unsigned num_textures; struct nv30_sampler_state *samplers[PIPE_MAX_SAMPLERS]; unsigned num_samplers; unsigned dirty_samplers; } vertprog; struct { struct nv30_fragprog *program; struct pipe_resource *constbuf; unsigned constbuf_nr; struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS]; unsigned num_textures; struct nv30_sampler_state *samplers[PIPE_MAX_SAMPLERS]; unsigned num_samplers; unsigned dirty_samplers; } fragprog; struct pipe_framebuffer_state framebuffer; struct pipe_blend_color blend_colour; struct pipe_stencil_ref stencil_ref; struct pipe_poly_stipple stipple; struct pipe_scissor_state scissor; struct pipe_viewport_state viewport; struct pipe_clip_state clip; unsigned sample_mask; struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; unsigned num_vtxbufs; struct pipe_index_buffer idxbuf; uint32_t vbo_fifo; uint32_t vbo_user; unsigned vbo_min_index; unsigned vbo_max_index; boolean vbo_push_hint; struct nouveau_heap *blit_vp; struct pipe_resource *blit_fp; /*XXX: nvfx state, DO NOT USE EVER OUTSIDE "STOLEN" NVFX code */ unsigned is_nv4x; unsigned use_nv4x; bool hw_pointsprite_control; enum { HW, } render_mode; }; static INLINE struct nv30_context * nv30_context(struct pipe_context *pipe) { return (struct nv30_context *)pipe; } struct pipe_context * nv30_context_create(struct pipe_screen *pscreen, void *priv); void nv30_vbo_init(struct pipe_context *pipe); void nv30_vbo_validate(struct nv30_context *nv30); void nv30_query_init(struct pipe_context *pipe); void nv30_state_init(struct pipe_context *pipe); void nv30_clear_init(struct pipe_context *pipe); void nv30_vertprog_init(struct pipe_context *pipe); void nv30_vertprog_validate(struct nv30_context *nv30); void nv30_fragprog_init(struct pipe_context *pipe); void nv30_fragprog_validate(struct nv30_context *nv30); void nv30_texture_init(struct pipe_context *pipe); void nv30_texture_validate(struct nv30_context *nv30); void nv30_fragtex_init(struct pipe_context *pipe); void nv30_fragtex_validate(struct nv30_context *nv30); void nv40_verttex_init(struct pipe_context *pipe); void nv40_verttex_validate(struct nv30_context *nv30); void nv30_push_vbo(struct nv30_context *nv30, const struct pipe_draw_info *info); void nv30_draw_init(struct pipe_context *pipe); void nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info); boolean nv30_state_validate(struct nv30_context *nv30, boolean hwtnl); void nv30_state_release(struct nv30_context *nv30); //XXX: needed to make it build, clean this up! void _nvfx_fragprog_translate(struct nv30_context *nvfx, struct nv30_fragprog *fp, boolean emulate_sprite_flipping); boolean _nvfx_vertprog_translate(struct nv30_context *nv30, struct nv30_vertprog *vp); #ifdef NV30_3D_VERTEX_BEGIN_END #define NV30_PRIM_GL_CASE(n) \ case PIPE_PRIM_##n: return NV30_3D_VERTEX_BEGIN_END_##n static INLINE unsigned nv30_prim_gl(unsigned prim) { switch (prim) { NV30_PRIM_GL_CASE(POINTS); NV30_PRIM_GL_CASE(LINES); NV30_PRIM_GL_CASE(LINE_LOOP); NV30_PRIM_GL_CASE(LINE_STRIP); NV30_PRIM_GL_CASE(TRIANGLES); NV30_PRIM_GL_CASE(TRIANGLE_STRIP); NV30_PRIM_GL_CASE(TRIANGLE_FAN); NV30_PRIM_GL_CASE(QUADS); NV30_PRIM_GL_CASE(QUAD_STRIP); NV30_PRIM_GL_CASE(POLYGON); default: return NV30_3D_VERTEX_BEGIN_END_POINTS; break; } } #endif #endif