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