noop_pipe.c revision 6dd284f7c8fac22f64c13fdf9909094f5ec59086
15da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
25da246944a787b933a509f0b65bab466574c3339Jerome Glisse * Copyright 2010 Red Hat Inc.
35da246944a787b933a509f0b65bab466574c3339Jerome Glisse *
45da246944a787b933a509f0b65bab466574c3339Jerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a
55da246944a787b933a509f0b65bab466574c3339Jerome Glisse * copy of this software and associated documentation files (the "Software"),
65da246944a787b933a509f0b65bab466574c3339Jerome Glisse * to deal in the Software without restriction, including without limitation
75da246944a787b933a509f0b65bab466574c3339Jerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub
85da246944a787b933a509f0b65bab466574c3339Jerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom
95da246944a787b933a509f0b65bab466574c3339Jerome Glisse * the Software is furnished to do so, subject to the following conditions:
105da246944a787b933a509f0b65bab466574c3339Jerome Glisse *
115da246944a787b933a509f0b65bab466574c3339Jerome Glisse * The above copyright notice and this permission notice (including the next
125da246944a787b933a509f0b65bab466574c3339Jerome Glisse * paragraph) shall be included in all copies or substantial portions of the
135da246944a787b933a509f0b65bab466574c3339Jerome Glisse * Software.
145da246944a787b933a509f0b65bab466574c3339Jerome Glisse *
155da246944a787b933a509f0b65bab466574c3339Jerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
165da246944a787b933a509f0b65bab466574c3339Jerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
175da246944a787b933a509f0b65bab466574c3339Jerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
185da246944a787b933a509f0b65bab466574c3339Jerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
195da246944a787b933a509f0b65bab466574c3339Jerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
205da246944a787b933a509f0b65bab466574c3339Jerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
215da246944a787b933a509f0b65bab466574c3339Jerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE.
225da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
235da246944a787b933a509f0b65bab466574c3339Jerome Glisse#include <stdio.h>
245da246944a787b933a509f0b65bab466574c3339Jerome Glisse#include <errno.h>
25625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "pipe/p_defines.h"
26625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "pipe/p_state.h"
27625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "pipe/p_context.h"
28625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "pipe/p_screen.h"
29625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "util/u_memory.h"
30625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "util/u_inlines.h"
31625593fde252269455f3e23baa5a63afb3389588Kai Wasserbäch#include "util/u_format.h"
325da246944a787b933a509f0b65bab466574c3339Jerome Glisse#include "noop_public.h"
333349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse
343349517351059dcd70a81b31bdffe9835bd8f216Jerome GlisseDEBUG_GET_ONCE_BOOL_OPTION(noop, "GALLIUM_NOOP", FALSE)
355da246944a787b933a509f0b65bab466574c3339Jerome Glisse
365da246944a787b933a509f0b65bab466574c3339Jerome Glissevoid noop_init_state_functions(struct pipe_context *ctx);
375da246944a787b933a509f0b65bab466574c3339Jerome Glisse
383349517351059dcd70a81b31bdffe9835bd8f216Jerome Glissestruct noop_pipe_screen {
393349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_screen	pscreen;
403349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_screen	*oscreen;
413349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse};
423349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse
435da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
445da246944a787b933a509f0b65bab466574c3339Jerome Glisse * query
455da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
465da246944a787b933a509f0b65bab466574c3339Jerome Glissestruct noop_query {
475da246944a787b933a509f0b65bab466574c3339Jerome Glisse	unsigned	query;
485da246944a787b933a509f0b65bab466574c3339Jerome Glisse};
495da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_query *noop_create_query(struct pipe_context *ctx, unsigned query_type)
505da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
515da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_query *query = CALLOC_STRUCT(noop_query);
525da246944a787b933a509f0b65bab466574c3339Jerome Glisse
535da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return (struct pipe_query *)query;
545da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
555da246944a787b933a509f0b65bab466574c3339Jerome Glisse
565da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_destroy_query(struct pipe_context *ctx, struct pipe_query *query)
575da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
585da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(query);
595da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
605da246944a787b933a509f0b65bab466574c3339Jerome Glisse
615da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_begin_query(struct pipe_context *ctx, struct pipe_query *query)
625da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
635da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
645da246944a787b933a509f0b65bab466574c3339Jerome Glisse
655da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_end_query(struct pipe_context *ctx, struct pipe_query *query)
665da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
675da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
685da246944a787b933a509f0b65bab466574c3339Jerome Glisse
695da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic boolean noop_get_query_result(struct pipe_context *ctx,
705da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_query *query,
715da246944a787b933a509f0b65bab466574c3339Jerome Glisse					boolean wait, void *vresult)
725da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
735da246944a787b933a509f0b65bab466574c3339Jerome Glisse	uint64_t *result = (uint64_t*)vresult;
745da246944a787b933a509f0b65bab466574c3339Jerome Glisse
755da246944a787b933a509f0b65bab466574c3339Jerome Glisse	*result = 0;
765da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return TRUE;
775da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
785da246944a787b933a509f0b65bab466574c3339Jerome Glisse
795da246944a787b933a509f0b65bab466574c3339Jerome Glisse
805da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
815da246944a787b933a509f0b65bab466574c3339Jerome Glisse * resource
825da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
835da246944a787b933a509f0b65bab466574c3339Jerome Glissestruct noop_resource {
845da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_resource	base;
855da246944a787b933a509f0b65bab466574c3339Jerome Glisse	unsigned		size;
865da246944a787b933a509f0b65bab466574c3339Jerome Glisse	char			*data;
875da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct sw_displaytarget	*dt;
885da246944a787b933a509f0b65bab466574c3339Jerome Glisse};
895da246944a787b933a509f0b65bab466574c3339Jerome Glisse
905da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_resource *noop_resource_create(struct pipe_screen *screen,
915da246944a787b933a509f0b65bab466574c3339Jerome Glisse						const struct pipe_resource *templ)
925da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
935da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_resource *nresource;
945da246944a787b933a509f0b65bab466574c3339Jerome Glisse	unsigned stride;
955da246944a787b933a509f0b65bab466574c3339Jerome Glisse
965da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource = CALLOC_STRUCT(noop_resource);
975da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (nresource == NULL)
985da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
995da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1005da246944a787b933a509f0b65bab466574c3339Jerome Glisse	stride = util_format_get_stride(templ->format, templ->width0);
1015da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->base = *templ;
1025da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->base.screen = screen;
1035da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->size = stride * templ->height0 * templ->depth0;
1045da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->data = malloc(nresource->size);
1055da246944a787b933a509f0b65bab466574c3339Jerome Glisse	pipe_reference_init(&nresource->base.reference, 1);
1065da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (nresource->data == NULL) {
1075da246944a787b933a509f0b65bab466574c3339Jerome Glisse		FREE(nresource);
1085da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
1095da246944a787b933a509f0b65bab466574c3339Jerome Glisse	}
1105da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return &nresource->base;
1115da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1125da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1133349517351059dcd70a81b31bdffe9835bd8f216Jerome Glissestatic struct pipe_resource *noop_resource_from_handle(struct pipe_screen *screen,
1145da246944a787b933a509f0b65bab466574c3339Jerome Glisse							const struct pipe_resource *templ,
1153349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse							struct winsys_handle *handle)
1165da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1173349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
1183349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_screen *oscreen = noop_screen->oscreen;
1193349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_resource *result;
1204d96af933710c74b3ccf3f24ee7d62e57f330bbaBrian Paul	struct pipe_resource *noop_resource;
1215da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1223349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	result = oscreen->resource_from_handle(oscreen, templ, handle);
1233349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	noop_resource = noop_resource_create(screen, result);
1243349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	pipe_resource_reference(&result, NULL);
1253349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	return noop_resource;
1265da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1275da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1285da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic boolean noop_resource_get_handle(struct pipe_screen *screen,
1295da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_resource *resource,
1305da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct winsys_handle *handle)
1315da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1323349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	return FALSE;
1335da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1345da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1355da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_resource_destroy(struct pipe_screen *screen,
1365da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_resource *resource)
1375da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1385da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_resource *nresource = (struct noop_resource *)resource;
1395da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1405da246944a787b933a509f0b65bab466574c3339Jerome Glisse	free(nresource->data);
1415da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(resource);
1425da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1435da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1445da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_resource *noop_user_buffer_create(struct pipe_screen *screen,
1455da246944a787b933a509f0b65bab466574c3339Jerome Glisse							void *ptr, unsigned bytes,
1465da246944a787b933a509f0b65bab466574c3339Jerome Glisse							unsigned bind)
1475da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1485da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_resource templ;
1495da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1505da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.target = PIPE_BUFFER;
1515da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.format = PIPE_FORMAT_R8_UNORM;
1525da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.usage = PIPE_USAGE_IMMUTABLE;
1535da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.bind = bind;
1545da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.width0 = bytes;
1555da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.height0 = 1;
1565da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.depth0 = 1;
1575da246944a787b933a509f0b65bab466574c3339Jerome Glisse	templ.flags = 0;
1585da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return noop_resource_create(screen, &templ);
1595da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1605da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1615da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1625da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
1635da246944a787b933a509f0b65bab466574c3339Jerome Glisse * transfer
1645da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
1655da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_transfer *noop_get_transfer(struct pipe_context *context,
1665da246944a787b933a509f0b65bab466574c3339Jerome Glisse						struct pipe_resource *resource,
1674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger						unsigned level,
1685da246944a787b933a509f0b65bab466574c3339Jerome Glisse						enum pipe_transfer_usage usage,
1695da246944a787b933a509f0b65bab466574c3339Jerome Glisse						const struct pipe_box *box)
1705da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1715da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_transfer *transfer;
1725da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1735da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer = CALLOC_STRUCT(pipe_transfer);
1745da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (transfer == NULL)
1755da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
1765da246944a787b933a509f0b65bab466574c3339Jerome Glisse	pipe_resource_reference(&transfer->resource, resource);
1774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	transfer->level = level;
1785da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer->usage = usage;
1795da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer->box = *box;
1805da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer->stride = 1;
1814c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	transfer->layer_stride = 1;
1825da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return transfer;
1835da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1845da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1855da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void *noop_transfer_map(struct pipe_context *pipe,
1865da246944a787b933a509f0b65bab466574c3339Jerome Glisse				struct pipe_transfer *transfer)
1875da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1885da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_resource *nresource = (struct noop_resource *)transfer->resource;
1895da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1905da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return nresource->data;
1915da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1925da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1935da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_flush_region(struct pipe_context *pipe,
1945da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_transfer *transfer,
1955da246944a787b933a509f0b65bab466574c3339Jerome Glisse					const struct pipe_box *box)
1965da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1975da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1985da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1995da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_unmap(struct pipe_context *pipe,
2005da246944a787b933a509f0b65bab466574c3339Jerome Glisse				struct pipe_transfer *transfer)
2015da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2025da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2035da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2045da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_destroy(struct pipe_context *pipe,
2055da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_transfer *transfer)
2065da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2075da246944a787b933a509f0b65bab466574c3339Jerome Glisse	pipe_resource_reference(&transfer->resource, NULL);
2085da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(transfer);
2095da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2105da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2115da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_inline_write(struct pipe_context *pipe,
2125da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_resource *resource,
2134c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger					unsigned level,
2145da246944a787b933a509f0b65bab466574c3339Jerome Glisse					unsigned usage,
2155da246944a787b933a509f0b65bab466574c3339Jerome Glisse					const struct pipe_box *box,
2165da246944a787b933a509f0b65bab466574c3339Jerome Glisse					const void *data,
2175da246944a787b933a509f0b65bab466574c3339Jerome Glisse					unsigned stride,
2184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger					unsigned layer_stride)
2195da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2205da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2215da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2225da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2235da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
2245da246944a787b933a509f0b65bab466574c3339Jerome Glisse * clear/copy
2255da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
2265da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_clear(struct pipe_context *ctx, unsigned buffers,
2276dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		       const union pipe_color_union *color, double depth, unsigned stencil)
2285da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2295da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2305da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2315da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_clear_render_target(struct pipe_context *ctx,
2325da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     struct pipe_surface *dst,
2336dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie				     const union pipe_color_union *color,
2345da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned dstx, unsigned dsty,
2355da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned width, unsigned height)
2365da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2375da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2385da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2395da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_clear_depth_stencil(struct pipe_context *ctx,
2405da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     struct pipe_surface *dst,
2415da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned clear_flags,
2425da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     double depth,
2435da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned stencil,
2445da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned dstx, unsigned dsty,
2455da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned width, unsigned height)
2465da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2475da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2485da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2495da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_resource_copy_region(struct pipe_context *ctx,
2505da246944a787b933a509f0b65bab466574c3339Jerome Glisse				      struct pipe_resource *dst,
2514c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				      unsigned dst_level,
2525da246944a787b933a509f0b65bab466574c3339Jerome Glisse				      unsigned dstx, unsigned dsty, unsigned dstz,
2535da246944a787b933a509f0b65bab466574c3339Jerome Glisse				      struct pipe_resource *src,
2544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				      unsigned src_level,
2554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				      const struct pipe_box *src_box)
2565da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2575da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2585da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2595da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2605da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
2615da246944a787b933a509f0b65bab466574c3339Jerome Glisse * context
2625da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
2637e02303497237cde958c28608477d0c355a8038bMarek Olšákstatic void noop_flush(struct pipe_context *ctx,
2645da246944a787b933a509f0b65bab466574c3339Jerome Glisse			struct pipe_fence_handle **fence)
2655da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2665da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2675da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2685da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_destroy_context(struct pipe_context *ctx)
2695da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2705da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(ctx);
2715da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2725da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2735da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_context *noop_create_context(struct pipe_screen *screen, void *priv)
2745da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2755da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_context *ctx = CALLOC_STRUCT(pipe_context);
2765da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2775da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (ctx == NULL)
2785da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
2795da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->winsys = screen->winsys;
2805da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->screen = screen;
2815da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->priv = priv;
2825da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->destroy = noop_destroy_context;
2835da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->flush = noop_flush;
2845da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->clear = noop_clear;
2855da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->clear_render_target = noop_clear_render_target;
2865da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->clear_depth_stencil = noop_clear_depth_stencil;
2875da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->resource_copy_region = noop_resource_copy_region;
2885da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->create_query = noop_create_query;
2895da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->destroy_query = noop_destroy_query;
2905da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->begin_query = noop_begin_query;
2915da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->end_query = noop_end_query;
2925da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->get_query_result = noop_get_query_result;
2935da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->get_transfer = noop_get_transfer;
2945da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_map = noop_transfer_map;
2955da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_flush_region = noop_transfer_flush_region;
2965da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_unmap = noop_transfer_unmap;
2975da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_destroy = noop_transfer_destroy;
2985da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_inline_write = noop_transfer_inline_write;
2995da246944a787b933a509f0b65bab466574c3339Jerome Glisse	noop_init_state_functions(ctx);
3005da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3015da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return ctx;
3025da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3035da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3045da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3055da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
3065da246944a787b933a509f0b65bab466574c3339Jerome Glisse * pipe_screen
3075da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
3085da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_flush_frontbuffer(struct pipe_screen *_screen,
3094c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				   struct pipe_resource *resource,
3104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				   unsigned level, unsigned layer,
3114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				   void *context_private)
3125da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3135da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3145da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3155da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic const char *noop_get_vendor(struct pipe_screen* pscreen)
3165da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3175da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return "X.Org";
3185da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3195da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3205da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic const char *noop_get_name(struct pipe_screen* pscreen)
3215da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3225da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return "NOOP";
3235da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3245da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3255da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic int noop_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
3265da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
32721c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
32821c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák
32921c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->get_param(screen, param);
3305da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3315da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3325da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic float noop_get_paramf(struct pipe_screen* pscreen, enum pipe_cap param)
3335da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
33421c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
33521c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák
33621c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->get_paramf(screen, param);
3375da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3385da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3395da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic int noop_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
3405da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
34121c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
3425da246944a787b933a509f0b65bab466574c3339Jerome Glisse
34321c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->get_shader_param(screen, shader, param);
3445da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3455da246944a787b933a509f0b65bab466574c3339Jerome Glisse
34621c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšákstatic boolean noop_is_format_supported(struct pipe_screen* pscreen,
3475da246944a787b933a509f0b65bab466574c3339Jerome Glisse					enum pipe_format format,
3485da246944a787b933a509f0b65bab466574c3339Jerome Glisse					enum pipe_texture_target target,
3495da246944a787b933a509f0b65bab466574c3339Jerome Glisse					unsigned sample_count,
350e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                        unsigned usage)
3515da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
35221c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
35321c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák
35421c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->is_format_supported(screen, format, target, sample_count, usage);
3555da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3565da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3575da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_destroy_screen(struct pipe_screen *screen)
3585da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3593349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
3603349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_screen *oscreen = noop_screen->oscreen;
3613349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse
3623349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	oscreen->destroy(oscreen);
3635da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(screen);
3645da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3655da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3663349517351059dcd70a81b31bdffe9835bd8f216Jerome Glissestruct pipe_screen *noop_screen_create(struct pipe_screen *oscreen)
3675da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3683349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct noop_pipe_screen *noop_screen;
3695da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_screen *screen;
3705da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3713349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	if (!debug_get_option_noop()) {
3723349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse		return oscreen;
3733349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	}
3743349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse
3753349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	noop_screen = CALLOC_STRUCT(noop_pipe_screen);
3763349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	if (noop_screen == NULL) {
3775da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
3785da246944a787b933a509f0b65bab466574c3339Jerome Glisse	}
3793349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	noop_screen->oscreen = oscreen;
3803349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	screen = &noop_screen->pscreen;
3815da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3823349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	screen->winsys = oscreen->winsys;
3835da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->destroy = noop_destroy_screen;
3845da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_name = noop_get_name;
3855da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_vendor = noop_get_vendor;
3865da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_param = noop_get_param;
3875da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_shader_param = noop_get_shader_param;
3885da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_paramf = noop_get_paramf;
3895da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->is_format_supported = noop_is_format_supported;
3905da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->context_create = noop_create_context;
3915da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_create = noop_resource_create;
3925da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_from_handle = noop_resource_from_handle;
3935da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_get_handle = noop_resource_get_handle;
3945da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_destroy = noop_resource_destroy;
3955da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->user_buffer_create = noop_user_buffer_create;
3965da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->flush_frontbuffer = noop_flush_frontbuffer;
3975da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3985da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return screen;
3995da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
400