Revert "r600g: simplify states"
[mesa.git] / src / gallium / winsys / r600 / drm / radeon_draw.c
1 /*
2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors:
24 * Jerome Glisse
25 */
26 #include <stdlib.h>
27 #include <string.h>
28 #include <errno.h>
29 #include "radeon_priv.h"
30
31 /*
32 * draw functions
33 */
34 struct radeon_draw *radeon_draw(struct radeon *radeon)
35 {
36 struct radeon_draw *draw;
37
38 draw = calloc(1, sizeof(*draw));
39 if (draw == NULL)
40 return NULL;
41 draw->nstate = radeon->nstate;
42 draw->radeon = radeon;
43 draw->refcount = 1;
44 draw->state = calloc(1, sizeof(void*) * draw->nstate);
45 if (draw->state == NULL) {
46 free(draw);
47 return NULL;
48 }
49 return draw;
50 }
51
52 struct radeon_draw *radeon_draw_incref(struct radeon_draw *draw)
53 {
54 draw->refcount++;
55 return draw;
56 }
57
58 struct radeon_draw *radeon_draw_decref(struct radeon_draw *draw)
59 {
60 unsigned i;
61
62 if (draw == NULL)
63 return NULL;
64 if (--draw->refcount > 0)
65 return NULL;
66 for (i = 0; i < draw->nstate; i++) {
67 draw->state[i] = radeon_state_decref(draw->state[i]);
68 }
69 free(draw->state);
70 memset(draw, 0, sizeof(*draw));
71 free(draw);
72 return NULL;
73 }
74
75 int radeon_draw_set_new(struct radeon_draw *draw, struct radeon_state *state)
76 {
77 if (state == NULL)
78 return 0;
79 if (state->type >= draw->radeon->ntype)
80 return -EINVAL;
81 draw->state[state->id] = radeon_state_decref(draw->state[state->id]);
82 draw->state[state->id] = state;
83 return 0;
84 }
85
86 int radeon_draw_set(struct radeon_draw *draw, struct radeon_state *state)
87 {
88 if (state == NULL)
89 return 0;
90 radeon_state_incref(state);
91 return radeon_draw_set_new(draw, state);
92 }
93
94 int radeon_draw_check(struct radeon_draw *draw)
95 {
96 unsigned i;
97 int r;
98
99 r = radeon_draw_pm4(draw);
100 if (r)
101 return r;
102 for (i = 0, draw->cpm4 = 0; i < draw->nstate; i++) {
103 if (draw->state[i]) {
104 draw->cpm4 += draw->state[i]->cpm4;
105 }
106 }
107 return 0;
108 }
109
110 struct radeon_draw *radeon_draw_duplicate(struct radeon_draw *draw)
111 {
112 struct radeon_draw *ndraw;
113 unsigned i;
114
115 if (draw == NULL)
116 return NULL;
117 ndraw = radeon_draw(draw->radeon);
118 if (ndraw == NULL) {
119 return NULL;
120 }
121 for (i = 0; i < draw->nstate; i++) {
122 if (radeon_draw_set(ndraw, draw->state[i])) {
123 radeon_draw_decref(ndraw);
124 return NULL;
125 }
126 }
127 return ndraw;
128 }
129
130 int radeon_draw_pm4(struct radeon_draw *draw)
131 {
132 unsigned i;
133 int r;
134
135 for (i = 0; i < draw->nstate; i++) {
136 r = radeon_state_pm4(draw->state[i]);
137 if (r)
138 return r;
139 }
140 return 0;
141 }