nv50_context.h revision 32cd1a0345eaf1f4da8a60a4ac2145ff51383d59
1#ifndef __NV50_CONTEXT_H__ 2#define __NV50_CONTEXT_H__ 3 4#include "pipe/p_context.h" 5#include "pipe/p_defines.h" 6#include "pipe/p_state.h" 7#include "pipe/p_compiler.h" 8 9#include "util/u_memory.h" 10#include "util/u_math.h" 11 12#include "draw/draw_vertex.h" 13 14#include "nouveau/nouveau_winsys.h" 15#include "nouveau/nouveau_gldefs.h" 16#include "nouveau/nouveau_stateobj.h" 17 18#include "nv50_screen.h" 19#include "nv50_program.h" 20 21#define NOUVEAU_ERR(fmt, args...) \ 22 fprintf(stderr, "%s:%d - "fmt, __func__, __LINE__, ##args); 23#define NOUVEAU_MSG(fmt, args...) \ 24 fprintf(stderr, "nouveau: "fmt, ##args); 25 26/* Constant buffer assignment */ 27#define NV50_CB_PMISC 0 28#define NV50_CB_PVP 1 29#define NV50_CB_PFP 2 30#define NV50_CB_PGP 3 31#define NV50_CB_TIC 4 32#define NV50_CB_TSC 5 33#define NV50_CB_PUPLOAD 6 34 35#define NV50_NEW_BLEND (1 << 0) 36#define NV50_NEW_ZSA (1 << 1) 37#define NV50_NEW_BLEND_COLOUR (1 << 2) 38#define NV50_NEW_STIPPLE (1 << 3) 39#define NV50_NEW_SCISSOR (1 << 4) 40#define NV50_NEW_VIEWPORT (1 << 5) 41#define NV50_NEW_RASTERIZER (1 << 6) 42#define NV50_NEW_FRAMEBUFFER (1 << 7) 43#define NV50_NEW_VERTPROG (1 << 8) 44#define NV50_NEW_VERTPROG_CB (1 << 9) 45#define NV50_NEW_FRAGPROG (1 << 10) 46#define NV50_NEW_FRAGPROG_CB (1 << 11) 47#define NV50_NEW_ARRAYS (1 << 12) 48#define NV50_NEW_SAMPLER (1 << 13) 49#define NV50_NEW_TEXTURE (1 << 14) 50 51struct nv50_blend_stateobj { 52 struct pipe_blend_state pipe; 53 struct nouveau_stateobj *so; 54}; 55 56struct nv50_zsa_stateobj { 57 struct pipe_depth_stencil_alpha_state pipe; 58 struct nouveau_stateobj *so; 59}; 60 61struct nv50_rasterizer_stateobj { 62 struct pipe_rasterizer_state pipe; 63 struct nouveau_stateobj *so; 64}; 65 66struct nv50_miptree_level { 67 struct pipe_buffer **image; 68 int *image_offset; 69 unsigned image_dirty_cpu[512/32]; 70 unsigned image_dirty_gpu[512/32]; 71}; 72 73struct nv50_miptree { 74 struct pipe_texture base; 75 struct pipe_buffer *buffer; 76 77 struct nv50_miptree_level level[PIPE_MAX_TEXTURE_LEVELS]; 78 int image_nr; 79 int total_size; 80}; 81 82static INLINE struct nv50_miptree * 83nv50_miptree(struct pipe_texture *pt) 84{ 85 return (struct nv50_miptree *)pt; 86} 87 88struct nv50_surface { 89 struct pipe_surface base; 90}; 91 92static INLINE struct nv50_surface * 93nv50_surface(struct pipe_surface *pt) 94{ 95 return (struct nv50_surface *)pt; 96} 97 98static INLINE struct pipe_buffer * 99nv50_surface_buffer(struct pipe_surface *surface) 100{ 101 struct nv50_miptree *mt = (struct nv50_miptree *)surface->texture; 102 return mt->buffer; 103} 104 105struct nv50_state { 106 unsigned dirty; 107 108 struct nouveau_stateobj *fb; 109 struct nouveau_stateobj *blend; 110 struct nouveau_stateobj *blend_colour; 111 struct nouveau_stateobj *zsa; 112 struct nouveau_stateobj *rast; 113 struct nouveau_stateobj *stipple; 114 struct nouveau_stateobj *scissor; 115 unsigned scissor_enabled; 116 struct nouveau_stateobj *viewport; 117 unsigned viewport_bypass; 118 struct nouveau_stateobj *tsc_upload; 119 struct nouveau_stateobj *tic_upload; 120 struct nouveau_stateobj *vertprog; 121 struct nouveau_stateobj *fragprog; 122 struct nouveau_stateobj *vtxfmt; 123 struct nouveau_stateobj *vtxbuf; 124}; 125 126struct nv50_context { 127 struct pipe_context pipe; 128 129 struct nv50_screen *screen; 130 unsigned pctx_id; 131 132 struct draw_context *draw; 133 134 struct nv50_state state; 135 136 unsigned dirty; 137 struct nv50_blend_stateobj *blend; 138 struct nv50_zsa_stateobj *zsa; 139 struct nv50_rasterizer_stateobj *rasterizer; 140 struct pipe_blend_color blend_colour; 141 struct pipe_poly_stipple stipple; 142 struct pipe_scissor_state scissor; 143 struct pipe_viewport_state viewport; 144 struct pipe_framebuffer_state framebuffer; 145 struct nv50_program *vertprog; 146 struct nv50_program *fragprog; 147 struct pipe_buffer *constbuf[PIPE_SHADER_TYPES]; 148 struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; 149 unsigned vtxbuf_nr; 150 struct pipe_vertex_element vtxelt[PIPE_MAX_ATTRIBS]; 151 unsigned vtxelt_nr; 152 unsigned *sampler[PIPE_MAX_SAMPLERS]; 153 unsigned sampler_nr; 154 struct nv50_miptree *miptree[PIPE_MAX_SAMPLERS]; 155 unsigned miptree_nr; 156}; 157 158static INLINE struct nv50_context * 159nv50_context(struct pipe_context *pipe) 160{ 161 return (struct nv50_context *)pipe; 162} 163 164extern void nv50_init_surface_functions(struct nv50_context *nv50); 165extern void nv50_init_state_functions(struct nv50_context *nv50); 166extern void nv50_init_query_functions(struct nv50_context *nv50); 167 168extern void nv50_screen_init_miptree_functions(struct pipe_screen *pscreen); 169 170extern int 171nv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst, 172 int dx, int dy, struct pipe_surface *src, int sx, int sy, 173 int w, int h); 174 175/* nv50_draw.c */ 176extern struct draw_stage *nv50_draw_render_stage(struct nv50_context *nv50); 177 178/* nv50_vbo.c */ 179extern boolean nv50_draw_arrays(struct pipe_context *, unsigned mode, 180 unsigned start, unsigned count); 181extern boolean nv50_draw_elements(struct pipe_context *pipe, 182 struct pipe_buffer *indexBuffer, 183 unsigned indexSize, 184 unsigned mode, unsigned start, 185 unsigned count); 186extern void nv50_vbo_validate(struct nv50_context *nv50); 187 188/* nv50_clear.c */ 189extern void nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps, 190 unsigned clearValue); 191 192/* nv50_program.c */ 193extern void nv50_vertprog_validate(struct nv50_context *nv50); 194extern void nv50_fragprog_validate(struct nv50_context *nv50); 195extern void nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p); 196 197/* nv50_state_validate.c */ 198extern boolean nv50_state_validate(struct nv50_context *nv50); 199 200/* nv50_tex.c */ 201extern void nv50_tex_validate(struct nv50_context *); 202 203/* nv50_miptree.c */ 204extern void nv50_miptree_sync(struct pipe_screen *, struct nv50_miptree *, 205 unsigned level, unsigned image); 206 207#endif 208