Home | History | Annotate | Download | only in nv30
      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 
     43 struct 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 
    127 static inline struct nv30_context *
    128 nv30_context(struct pipe_context *pipe)
    129 {
    130    return (struct nv30_context *)pipe;
    131 }
    132 
    133 struct pipe_context *
    134 nv30_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
    135 
    136 void
    137 nv30_vbo_init(struct pipe_context *pipe);
    138 
    139 void
    140 nv30_vbo_validate(struct nv30_context *nv30);
    141 
    142 void
    143 nv30_query_init(struct pipe_context *pipe);
    144 
    145 void
    146 nv30_state_init(struct pipe_context *pipe);
    147 
    148 void
    149 nv30_clear_init(struct pipe_context *pipe);
    150 
    151 void
    152 nv30_vertprog_init(struct pipe_context *pipe);
    153 
    154 void
    155 nv30_vertprog_validate(struct nv30_context *nv30);
    156 
    157 void
    158 nv30_fragprog_init(struct pipe_context *pipe);
    159 
    160 void
    161 nv30_fragprog_validate(struct nv30_context *nv30);
    162 
    163 void
    164 nv30_texture_init(struct pipe_context *pipe);
    165 
    166 void
    167 nv30_texture_validate(struct nv30_context *nv30);
    168 
    169 void
    170 nv30_fragtex_init(struct pipe_context *pipe);
    171 
    172 void
    173 nv30_fragtex_validate(struct nv30_context *nv30);
    174 
    175 void
    176 nv40_verttex_init(struct pipe_context *pipe);
    177 
    178 void
    179 nv40_verttex_validate(struct nv30_context *nv30);
    180 
    181 void
    182 nv30_fragtex_sampler_states_bind(struct pipe_context *pipe,
    183                                  unsigned nr, void **hwcso);
    184 
    185 void
    186 nv40_verttex_sampler_states_bind(struct pipe_context *pipe,
    187                                  unsigned nr, void **hwcso);
    188 
    189 void
    190 nv40_verttex_set_sampler_views(struct pipe_context *pipe, unsigned nr,
    191                                struct pipe_sampler_view **views);
    192 
    193 void
    194 nv30_fragtex_set_sampler_views(struct pipe_context *pipe,
    195                                unsigned nr, struct pipe_sampler_view **views);
    196 
    197 void
    198 nv30_push_vbo(struct nv30_context *nv30, const struct pipe_draw_info *info);
    199 
    200 void
    201 nv30_draw_init(struct pipe_context *pipe);
    202 
    203 void
    204 nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info);
    205 
    206 bool
    207 nv30_state_validate(struct nv30_context *nv30, uint32_t mask, bool hwtnl);
    208 
    209 void
    210 nv30_state_release(struct nv30_context *nv30);
    211 
    212 #ifdef NV30_3D_VERTEX_BEGIN_END
    213 #define NV30_PRIM_GL_CASE(n) \
    214    case PIPE_PRIM_##n: return NV30_3D_VERTEX_BEGIN_END_##n
    215 
    216 static inline unsigned
    217 nv30_prim_gl(unsigned prim)
    218 {
    219    switch (prim) {
    220    NV30_PRIM_GL_CASE(POINTS);
    221    NV30_PRIM_GL_CASE(LINES);
    222    NV30_PRIM_GL_CASE(LINE_LOOP);
    223    NV30_PRIM_GL_CASE(LINE_STRIP);
    224    NV30_PRIM_GL_CASE(TRIANGLES);
    225    NV30_PRIM_GL_CASE(TRIANGLE_STRIP);
    226    NV30_PRIM_GL_CASE(TRIANGLE_FAN);
    227    NV30_PRIM_GL_CASE(QUADS);
    228    NV30_PRIM_GL_CASE(QUAD_STRIP);
    229    NV30_PRIM_GL_CASE(POLYGON);
    230    default:
    231       return NV30_3D_VERTEX_BEGIN_END_POINTS;
    232       break;
    233    }
    234 }
    235 #endif
    236 
    237 #endif
    238