Merge remote branch 'origin/7.8'
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_render.h
1 /*
2 * Copyright (C) 2009-2010 Francisco Jerez.
3 * All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 *
25 */
26
27 #ifndef __NOUVEAU_RENDER_H__
28 #define __NOUVEAU_RENDER_H__
29
30 #include "vbo/vbo_context.h"
31
32 struct nouveau_array_state;
33
34 typedef void (*dispatch_t)(GLcontext *, unsigned int, int, unsigned int);
35 typedef unsigned (*extract_u_t)(struct nouveau_array_state *, int, int);
36 typedef float (*extract_f_t)(struct nouveau_array_state *, int, int);
37
38 struct nouveau_attr_info {
39 int vbo_index;
40 int imm_method;
41 int imm_fields;
42
43 void (*emit)(GLcontext *, struct nouveau_array_state *, const void *);
44 };
45
46 struct nouveau_array_state {
47 int attr;
48 int stride, fields, type;
49
50 struct nouveau_bo *bo;
51 unsigned offset;
52 const void *buf;
53
54 extract_u_t extract_u;
55 extract_f_t extract_f;
56 };
57
58 #define RENDER_SCRATCH_COUNT 32
59 #define RENDER_SCRATCH_SIZE 64*1024
60
61 struct nouveau_scratch_state {
62 struct nouveau_bo *bo[RENDER_SCRATCH_COUNT];
63
64 int index;
65 int offset;
66 void *buf;
67 };
68
69 struct nouveau_swtnl_state {
70 struct nouveau_bo *vbo;
71 void *buf;
72 unsigned vertex_count;
73 GLenum primitive;
74 };
75
76 struct nouveau_render_state {
77 enum {
78 VBO,
79 IMM
80 } mode;
81
82 struct nouveau_array_state ib;
83 struct nouveau_array_state attrs[VERT_ATTRIB_MAX];
84
85 /* Maps a HW VBO index or IMM emission order to an index in
86 * the attrs array above (or -1 if unused). */
87 int map[VERT_ATTRIB_MAX];
88
89 int attr_count;
90 int vertex_size;
91
92 struct nouveau_scratch_state scratch;
93 struct nouveau_swtnl_state swtnl;
94 };
95
96 #define to_render_state(ctx) (&to_nouveau_context(ctx)->render)
97
98 #endif