r600g: use floats instead of hex for blit vbo
[mesa.git] / src / gallium / drivers / rbug / rbug_objects.c
1 /**************************************************************************
2 *
3 * Copyright 2010 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #include "util/u_inlines.h"
29 #include "util/u_memory.h"
30 #include "util/u_simple_list.h"
31
32 #include "tgsi/tgsi_parse.h"
33
34 #include "rbug_screen.h"
35 #include "rbug_objects.h"
36 #include "rbug_context.h"
37
38
39
40 struct pipe_resource *
41 rbug_resource_create(struct rbug_screen *rb_screen,
42 struct pipe_resource *resource)
43 {
44 struct rbug_resource *rb_resource;
45
46 if(!resource)
47 goto error;
48
49 assert(resource->screen == rb_screen->screen);
50
51 rb_resource = CALLOC_STRUCT(rbug_resource);
52 if(!rb_resource)
53 goto error;
54
55 memcpy(&rb_resource->base, resource, sizeof(struct pipe_resource));
56
57 pipe_reference_init(&rb_resource->base.reference, 1);
58 rb_resource->base.screen = &rb_screen->base;
59 rb_resource->resource = resource;
60
61 rbug_screen_add_to_list(rb_screen, resources, rb_resource);
62
63 return &rb_resource->base;
64
65 error:
66 pipe_resource_reference(&resource, NULL);
67 return NULL;
68 }
69
70 void
71 rbug_resource_destroy(struct rbug_resource *rb_resource)
72 {
73 struct rbug_screen *rb_screen = rbug_screen(rb_resource->base.screen);
74 rbug_screen_remove_from_list(rb_screen, resources, rb_resource);
75
76 pipe_resource_reference(&rb_resource->resource, NULL);
77 FREE(rb_resource);
78 }
79
80
81 struct pipe_surface *
82 rbug_surface_create(struct rbug_resource *rb_resource,
83 struct pipe_surface *surface)
84 {
85 struct rbug_surface *rb_surface;
86
87 if(!surface)
88 goto error;
89
90 assert(surface->texture == rb_resource->resource);
91
92 rb_surface = CALLOC_STRUCT(rbug_surface);
93 if(!rb_surface)
94 goto error;
95
96 memcpy(&rb_surface->base, surface, sizeof(struct pipe_surface));
97
98 pipe_reference_init(&rb_surface->base.reference, 1);
99 rb_surface->base.texture = NULL;
100 pipe_resource_reference(&rb_surface->base.texture, &rb_resource->base);
101 rb_surface->surface = surface;
102
103 return &rb_surface->base;
104
105 error:
106 pipe_surface_reference(&surface, NULL);
107 return NULL;
108 }
109
110 void
111 rbug_surface_destroy(struct rbug_surface *rb_surface)
112 {
113 pipe_resource_reference(&rb_surface->base.texture, NULL);
114 pipe_surface_reference(&rb_surface->surface, NULL);
115 FREE(rb_surface);
116 }
117
118
119 struct pipe_sampler_view *
120 rbug_sampler_view_create(struct rbug_context *rb_context,
121 struct rbug_resource *rb_resource,
122 struct pipe_sampler_view *view)
123 {
124 struct rbug_sampler_view *rb_view;
125
126 if (!view)
127 goto error;
128
129 assert(view->texture == rb_resource->resource);
130
131 rb_view = MALLOC(sizeof(struct rbug_sampler_view));
132
133 rb_view->base = *view;
134 rb_view->base.reference.count = 1;
135 rb_view->base.texture = NULL;
136 pipe_resource_reference(&rb_view->base.texture, &rb_resource->base);
137 rb_view->base.context = rb_context->pipe;
138 rb_view->sampler_view = view;
139
140 return &rb_view->base;
141 error:
142 return NULL;
143 }
144
145 void
146 rbug_sampler_view_destroy(struct rbug_context *rb_context,
147 struct rbug_sampler_view *rb_view)
148 {
149 pipe_resource_reference(&rb_view->base.texture, NULL);
150 rb_context->pipe->sampler_view_destroy(rb_context->pipe,
151 rb_view->sampler_view);
152 FREE(rb_view);
153 }
154
155
156 struct pipe_transfer *
157 rbug_transfer_create(struct rbug_context *rb_context,
158 struct rbug_resource *rb_resource,
159 struct pipe_transfer *transfer)
160 {
161 struct rbug_transfer *rb_transfer;
162
163 if(!transfer)
164 goto error;
165
166 assert(transfer->resource == rb_resource->resource);
167
168 rb_transfer = CALLOC_STRUCT(rbug_transfer);
169 if(!rb_transfer)
170 goto error;
171
172 memcpy(&rb_transfer->base, transfer, sizeof(struct pipe_transfer));
173
174 rb_transfer->base.resource = NULL;
175 rb_transfer->transfer = transfer;
176 rb_transfer->pipe = rb_context->pipe;
177
178 pipe_resource_reference(&rb_transfer->base.resource, &rb_resource->base);
179 assert(rb_transfer->base.resource == &rb_resource->base);
180
181 return &rb_transfer->base;
182
183 error:
184 rb_context->pipe->transfer_destroy(rb_context->pipe, transfer);
185 return NULL;
186 }
187
188 void
189 rbug_transfer_destroy(struct rbug_context *rb_context,
190 struct rbug_transfer *rb_transfer)
191 {
192 pipe_resource_reference(&rb_transfer->base.resource, NULL);
193 rb_transfer->pipe->transfer_destroy(rb_context->pipe,
194 rb_transfer->transfer);
195 FREE(rb_transfer);
196 }
197
198 void *
199 rbug_shader_create(struct rbug_context *rb_context,
200 const struct pipe_shader_state *state,
201 void *result, enum rbug_shader_type type)
202 {
203 struct rbug_shader *rb_shader = CALLOC_STRUCT(rbug_shader);
204
205 rb_shader->type = type;
206 rb_shader->shader = result;
207 rb_shader->tokens = tgsi_dup_tokens(state->tokens);
208
209 /* works on context as well since its just a macro */
210 rbug_screen_add_to_list(rb_context, shaders, rb_shader);
211
212 return rb_shader;
213 }
214
215 void
216 rbug_shader_destroy(struct rbug_context *rb_context,
217 struct rbug_shader *rb_shader)
218 {
219 struct pipe_context *pipe = rb_context->pipe;
220
221 /* works on context as well since its just a macro */
222 rbug_screen_remove_from_list(rb_context, shaders, rb_shader);
223
224 switch(rb_shader->type) {
225 case RBUG_SHADER_FRAGMENT:
226 if (rb_shader->replaced_shader)
227 pipe->delete_fs_state(pipe, rb_shader->replaced_shader);
228 pipe->delete_fs_state(pipe, rb_shader->shader);
229 break;
230 case RBUG_SHADER_VERTEX:
231 if (rb_shader->replaced_shader)
232 pipe->delete_vs_state(pipe, rb_shader->replaced_shader);
233 pipe->delete_vs_state(pipe, rb_shader->shader);
234 break;
235 case RBUG_SHADER_GEOM:
236 if (rb_shader->replaced_shader)
237 pipe->delete_gs_state(pipe, rb_shader->replaced_shader);
238 pipe->delete_gs_state(pipe, rb_shader->shader);
239 break;
240 default:
241 assert(0);
242 }
243
244 FREE(rb_shader->replaced_tokens);
245 FREE(rb_shader->tokens);
246 FREE(rb_shader);
247 }