2 * Copyright 2010 Red Hat Inc.
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:
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
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.
25 #include "pipe/p_defines.h"
26 #include "pipe/p_state.h"
27 #include "pipe/p_context.h"
28 #include "pipe/p_screen.h"
29 #include "util/u_memory.h"
30 #include "util/u_inlines.h"
31 #include "util/u_format.h"
32 #include "noop_public.h"
34 DEBUG_GET_ONCE_BOOL_OPTION(noop
, "GALLIUM_NOOP", FALSE
)
36 void noop_init_state_functions(struct pipe_context
*ctx
);
38 struct noop_pipe_screen
{
39 struct pipe_screen pscreen
;
40 struct pipe_screen
*oscreen
;
49 static struct pipe_query
*noop_create_query(struct pipe_context
*ctx
, unsigned query_type
, unsigned index
)
51 struct noop_query
*query
= CALLOC_STRUCT(noop_query
);
53 return (struct pipe_query
*)query
;
56 static void noop_destroy_query(struct pipe_context
*ctx
, struct pipe_query
*query
)
61 static void noop_begin_query(struct pipe_context
*ctx
, struct pipe_query
*query
)
65 static void noop_end_query(struct pipe_context
*ctx
, struct pipe_query
*query
)
69 static boolean
noop_get_query_result(struct pipe_context
*ctx
,
70 struct pipe_query
*query
,
72 union pipe_query_result
*vresult
)
74 uint64_t *result
= (uint64_t*)vresult
;
84 struct noop_resource
{
85 struct pipe_resource base
;
88 struct sw_displaytarget
*dt
;
91 static struct pipe_resource
*noop_resource_create(struct pipe_screen
*screen
,
92 const struct pipe_resource
*templ
)
94 struct noop_resource
*nresource
;
97 nresource
= CALLOC_STRUCT(noop_resource
);
98 if (nresource
== NULL
)
101 stride
= util_format_get_stride(templ
->format
, templ
->width0
);
102 nresource
->base
= *templ
;
103 nresource
->base
.screen
= screen
;
104 nresource
->size
= stride
* templ
->height0
* templ
->depth0
;
105 nresource
->data
= MALLOC(nresource
->size
);
106 pipe_reference_init(&nresource
->base
.reference
, 1);
107 if (nresource
->data
== NULL
) {
111 return &nresource
->base
;
114 static struct pipe_resource
*noop_resource_from_handle(struct pipe_screen
*screen
,
115 const struct pipe_resource
*templ
,
116 struct winsys_handle
*handle
)
118 struct noop_pipe_screen
*noop_screen
= (struct noop_pipe_screen
*)screen
;
119 struct pipe_screen
*oscreen
= noop_screen
->oscreen
;
120 struct pipe_resource
*result
;
121 struct pipe_resource
*noop_resource
;
123 result
= oscreen
->resource_from_handle(oscreen
, templ
, handle
);
124 noop_resource
= noop_resource_create(screen
, result
);
125 pipe_resource_reference(&result
, NULL
);
126 return noop_resource
;
129 static boolean
noop_resource_get_handle(struct pipe_screen
*screen
,
130 struct pipe_resource
*resource
,
131 struct winsys_handle
*handle
)
136 static void noop_resource_destroy(struct pipe_screen
*screen
,
137 struct pipe_resource
*resource
)
139 struct noop_resource
*nresource
= (struct noop_resource
*)resource
;
141 FREE(nresource
->data
);
149 static void *noop_transfer_map(struct pipe_context
*pipe
,
150 struct pipe_resource
*resource
,
152 enum pipe_transfer_usage usage
,
153 const struct pipe_box
*box
,
154 struct pipe_transfer
**ptransfer
)
156 struct pipe_transfer
*transfer
;
157 struct noop_resource
*nresource
= (struct noop_resource
*)resource
;
159 transfer
= CALLOC_STRUCT(pipe_transfer
);
160 if (transfer
== NULL
)
162 pipe_resource_reference(&transfer
->resource
, resource
);
163 transfer
->level
= level
;
164 transfer
->usage
= usage
;
165 transfer
->box
= *box
;
166 transfer
->stride
= 1;
167 transfer
->layer_stride
= 1;
168 *ptransfer
= transfer
;
170 return nresource
->data
;
173 static void noop_transfer_flush_region(struct pipe_context
*pipe
,
174 struct pipe_transfer
*transfer
,
175 const struct pipe_box
*box
)
179 static void noop_transfer_unmap(struct pipe_context
*pipe
,
180 struct pipe_transfer
*transfer
)
182 pipe_resource_reference(&transfer
->resource
, NULL
);
186 static void noop_transfer_inline_write(struct pipe_context
*pipe
,
187 struct pipe_resource
*resource
,
190 const struct pipe_box
*box
,
193 unsigned layer_stride
)
201 static void noop_clear(struct pipe_context
*ctx
, unsigned buffers
,
202 const union pipe_color_union
*color
, double depth
, unsigned stencil
)
206 static void noop_clear_render_target(struct pipe_context
*ctx
,
207 struct pipe_surface
*dst
,
208 const union pipe_color_union
*color
,
209 unsigned dstx
, unsigned dsty
,
210 unsigned width
, unsigned height
)
214 static void noop_clear_depth_stencil(struct pipe_context
*ctx
,
215 struct pipe_surface
*dst
,
216 unsigned clear_flags
,
219 unsigned dstx
, unsigned dsty
,
220 unsigned width
, unsigned height
)
224 static void noop_resource_copy_region(struct pipe_context
*ctx
,
225 struct pipe_resource
*dst
,
227 unsigned dstx
, unsigned dsty
, unsigned dstz
,
228 struct pipe_resource
*src
,
230 const struct pipe_box
*src_box
)
235 static void noop_blit(struct pipe_context
*ctx
,
236 const struct pipe_blit_info
*info
)
242 noop_flush_resource(struct pipe_context
*ctx
,
243 struct pipe_resource
*resource
)
251 static void noop_flush(struct pipe_context
*ctx
,
252 struct pipe_fence_handle
**fence
,
257 static void noop_destroy_context(struct pipe_context
*ctx
)
262 static struct pipe_context
*noop_create_context(struct pipe_screen
*screen
, void *priv
)
264 struct pipe_context
*ctx
= CALLOC_STRUCT(pipe_context
);
268 ctx
->screen
= screen
;
270 ctx
->destroy
= noop_destroy_context
;
271 ctx
->flush
= noop_flush
;
272 ctx
->clear
= noop_clear
;
273 ctx
->clear_render_target
= noop_clear_render_target
;
274 ctx
->clear_depth_stencil
= noop_clear_depth_stencil
;
275 ctx
->resource_copy_region
= noop_resource_copy_region
;
276 ctx
->blit
= noop_blit
;
277 ctx
->flush_resource
= noop_flush_resource
;
278 ctx
->create_query
= noop_create_query
;
279 ctx
->destroy_query
= noop_destroy_query
;
280 ctx
->begin_query
= noop_begin_query
;
281 ctx
->end_query
= noop_end_query
;
282 ctx
->get_query_result
= noop_get_query_result
;
283 ctx
->transfer_map
= noop_transfer_map
;
284 ctx
->transfer_flush_region
= noop_transfer_flush_region
;
285 ctx
->transfer_unmap
= noop_transfer_unmap
;
286 ctx
->transfer_inline_write
= noop_transfer_inline_write
;
287 noop_init_state_functions(ctx
);
296 static void noop_flush_frontbuffer(struct pipe_screen
*_screen
,
297 struct pipe_resource
*resource
,
298 unsigned level
, unsigned layer
,
299 void *context_private
, struct pipe_box
*box
)
303 static const char *noop_get_vendor(struct pipe_screen
* pscreen
)
308 static const char *noop_get_name(struct pipe_screen
* pscreen
)
313 static int noop_get_param(struct pipe_screen
* pscreen
, enum pipe_cap param
)
315 struct pipe_screen
*screen
= ((struct noop_pipe_screen
*)pscreen
)->oscreen
;
317 return screen
->get_param(screen
, param
);
320 static float noop_get_paramf(struct pipe_screen
* pscreen
,
321 enum pipe_capf param
)
323 struct pipe_screen
*screen
= ((struct noop_pipe_screen
*)pscreen
)->oscreen
;
325 return screen
->get_paramf(screen
, param
);
328 static int noop_get_shader_param(struct pipe_screen
* pscreen
, unsigned shader
, enum pipe_shader_cap param
)
330 struct pipe_screen
*screen
= ((struct noop_pipe_screen
*)pscreen
)->oscreen
;
332 return screen
->get_shader_param(screen
, shader
, param
);
335 static boolean
noop_is_format_supported(struct pipe_screen
* pscreen
,
336 enum pipe_format format
,
337 enum pipe_texture_target target
,
338 unsigned sample_count
,
341 struct pipe_screen
*screen
= ((struct noop_pipe_screen
*)pscreen
)->oscreen
;
343 return screen
->is_format_supported(screen
, format
, target
, sample_count
, usage
);
346 static uint64_t noop_get_timestamp(struct pipe_screen
*pscreen
)
351 static void noop_destroy_screen(struct pipe_screen
*screen
)
353 struct noop_pipe_screen
*noop_screen
= (struct noop_pipe_screen
*)screen
;
354 struct pipe_screen
*oscreen
= noop_screen
->oscreen
;
356 oscreen
->destroy(oscreen
);
360 struct pipe_screen
*noop_screen_create(struct pipe_screen
*oscreen
)
362 struct noop_pipe_screen
*noop_screen
;
363 struct pipe_screen
*screen
;
365 if (!debug_get_option_noop()) {
369 noop_screen
= CALLOC_STRUCT(noop_pipe_screen
);
370 if (noop_screen
== NULL
) {
373 noop_screen
->oscreen
= oscreen
;
374 screen
= &noop_screen
->pscreen
;
376 screen
->destroy
= noop_destroy_screen
;
377 screen
->get_name
= noop_get_name
;
378 screen
->get_vendor
= noop_get_vendor
;
379 screen
->get_param
= noop_get_param
;
380 screen
->get_shader_param
= noop_get_shader_param
;
381 screen
->get_paramf
= noop_get_paramf
;
382 screen
->is_format_supported
= noop_is_format_supported
;
383 screen
->context_create
= noop_create_context
;
384 screen
->resource_create
= noop_resource_create
;
385 screen
->resource_from_handle
= noop_resource_from_handle
;
386 screen
->resource_get_handle
= noop_resource_get_handle
;
387 screen
->resource_destroy
= noop_resource_destroy
;
388 screen
->flush_frontbuffer
= noop_flush_frontbuffer
;
389 screen
->get_timestamp
= noop_get_timestamp
;