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,
714445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák					boolean wait,
724445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák					union pipe_query_result *vresult)
735da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
745da246944a787b933a509f0b65bab466574c3339Jerome Glisse	uint64_t *result = (uint64_t*)vresult;
755da246944a787b933a509f0b65bab466574c3339Jerome Glisse
765da246944a787b933a509f0b65bab466574c3339Jerome Glisse	*result = 0;
775da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return TRUE;
785da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
795da246944a787b933a509f0b65bab466574c3339Jerome Glisse
805da246944a787b933a509f0b65bab466574c3339Jerome Glisse
815da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
825da246944a787b933a509f0b65bab466574c3339Jerome Glisse * resource
835da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
845da246944a787b933a509f0b65bab466574c3339Jerome Glissestruct noop_resource {
855da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_resource	base;
865da246944a787b933a509f0b65bab466574c3339Jerome Glisse	unsigned		size;
875da246944a787b933a509f0b65bab466574c3339Jerome Glisse	char			*data;
885da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct sw_displaytarget	*dt;
895da246944a787b933a509f0b65bab466574c3339Jerome Glisse};
905da246944a787b933a509f0b65bab466574c3339Jerome Glisse
915da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_resource *noop_resource_create(struct pipe_screen *screen,
925da246944a787b933a509f0b65bab466574c3339Jerome Glisse						const struct pipe_resource *templ)
935da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
945da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_resource *nresource;
955da246944a787b933a509f0b65bab466574c3339Jerome Glisse	unsigned stride;
965da246944a787b933a509f0b65bab466574c3339Jerome Glisse
975da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource = CALLOC_STRUCT(noop_resource);
985da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (nresource == NULL)
995da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
1005da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1015da246944a787b933a509f0b65bab466574c3339Jerome Glisse	stride = util_format_get_stride(templ->format, templ->width0);
1025da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->base = *templ;
1035da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->base.screen = screen;
1045da246944a787b933a509f0b65bab466574c3339Jerome Glisse	nresource->size = stride * templ->height0 * templ->depth0;
105785b9e7c780d8e436ef557a22cf916f7869f7390José Fonseca	nresource->data = MALLOC(nresource->size);
1065da246944a787b933a509f0b65bab466574c3339Jerome Glisse	pipe_reference_init(&nresource->base.reference, 1);
1075da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (nresource->data == NULL) {
1085da246944a787b933a509f0b65bab466574c3339Jerome Glisse		FREE(nresource);
1095da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
1105da246944a787b933a509f0b65bab466574c3339Jerome Glisse	}
1115da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return &nresource->base;
1125da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1135da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1143349517351059dcd70a81b31bdffe9835bd8f216Jerome Glissestatic struct pipe_resource *noop_resource_from_handle(struct pipe_screen *screen,
1155da246944a787b933a509f0b65bab466574c3339Jerome Glisse							const struct pipe_resource *templ,
1163349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse							struct winsys_handle *handle)
1175da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1183349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
1193349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_screen *oscreen = noop_screen->oscreen;
1203349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_resource *result;
1214d96af933710c74b3ccf3f24ee7d62e57f330bbaBrian Paul	struct pipe_resource *noop_resource;
1225da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1233349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	result = oscreen->resource_from_handle(oscreen, templ, handle);
1243349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	noop_resource = noop_resource_create(screen, result);
1253349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	pipe_resource_reference(&result, NULL);
1263349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	return noop_resource;
1275da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1285da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1295da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic boolean noop_resource_get_handle(struct pipe_screen *screen,
1305da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_resource *resource,
1315da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct winsys_handle *handle)
1325da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1333349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	return FALSE;
1345da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1355da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1365da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_resource_destroy(struct pipe_screen *screen,
1375da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_resource *resource)
1385da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1395da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_resource *nresource = (struct noop_resource *)resource;
1405da246944a787b933a509f0b65bab466574c3339Jerome Glisse
141785b9e7c780d8e436ef557a22cf916f7869f7390José Fonseca	FREE(nresource->data);
1425da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(resource);
1435da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1445da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1455da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1465da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
1475da246944a787b933a509f0b65bab466574c3339Jerome Glisse * transfer
1485da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
1495da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_transfer *noop_get_transfer(struct pipe_context *context,
1505da246944a787b933a509f0b65bab466574c3339Jerome Glisse						struct pipe_resource *resource,
1514c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger						unsigned level,
1525da246944a787b933a509f0b65bab466574c3339Jerome Glisse						enum pipe_transfer_usage usage,
1535da246944a787b933a509f0b65bab466574c3339Jerome Glisse						const struct pipe_box *box)
1545da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1555da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_transfer *transfer;
1565da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1575da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer = CALLOC_STRUCT(pipe_transfer);
1585da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (transfer == NULL)
1595da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
1605da246944a787b933a509f0b65bab466574c3339Jerome Glisse	pipe_resource_reference(&transfer->resource, resource);
1614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	transfer->level = level;
1625da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer->usage = usage;
1635da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer->box = *box;
1645da246944a787b933a509f0b65bab466574c3339Jerome Glisse	transfer->stride = 1;
1654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	transfer->layer_stride = 1;
1665da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return transfer;
1675da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1685da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1695da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void *noop_transfer_map(struct pipe_context *pipe,
1705da246944a787b933a509f0b65bab466574c3339Jerome Glisse				struct pipe_transfer *transfer)
1715da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1725da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct noop_resource *nresource = (struct noop_resource *)transfer->resource;
1735da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1745da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return nresource->data;
1755da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1765da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1775da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_flush_region(struct pipe_context *pipe,
1785da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_transfer *transfer,
1795da246944a787b933a509f0b65bab466574c3339Jerome Glisse					const struct pipe_box *box)
1805da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1815da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1825da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1835da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_unmap(struct pipe_context *pipe,
1845da246944a787b933a509f0b65bab466574c3339Jerome Glisse				struct pipe_transfer *transfer)
1855da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1865da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1875da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1885da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_destroy(struct pipe_context *pipe,
1895da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_transfer *transfer)
1905da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
1915da246944a787b933a509f0b65bab466574c3339Jerome Glisse	pipe_resource_reference(&transfer->resource, NULL);
1925da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(transfer);
1935da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
1945da246944a787b933a509f0b65bab466574c3339Jerome Glisse
1955da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_transfer_inline_write(struct pipe_context *pipe,
1965da246944a787b933a509f0b65bab466574c3339Jerome Glisse					struct pipe_resource *resource,
1974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger					unsigned level,
1985da246944a787b933a509f0b65bab466574c3339Jerome Glisse					unsigned usage,
1995da246944a787b933a509f0b65bab466574c3339Jerome Glisse					const struct pipe_box *box,
2005da246944a787b933a509f0b65bab466574c3339Jerome Glisse					const void *data,
2015da246944a787b933a509f0b65bab466574c3339Jerome Glisse					unsigned stride,
2024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger					unsigned layer_stride)
2035da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2045da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2055da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2065da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2075da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
2085da246944a787b933a509f0b65bab466574c3339Jerome Glisse * clear/copy
2095da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
2105da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_clear(struct pipe_context *ctx, unsigned buffers,
2116dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		       const union pipe_color_union *color, double depth, unsigned stencil)
2125da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2135da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2145da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2155da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_clear_render_target(struct pipe_context *ctx,
2165da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     struct pipe_surface *dst,
2176dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie				     const union pipe_color_union *color,
2185da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned dstx, unsigned dsty,
2195da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned width, unsigned height)
2205da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2215da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2225da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2235da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_clear_depth_stencil(struct pipe_context *ctx,
2245da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     struct pipe_surface *dst,
2255da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned clear_flags,
2265da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     double depth,
2275da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned stencil,
2285da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned dstx, unsigned dsty,
2295da246944a787b933a509f0b65bab466574c3339Jerome Glisse				     unsigned width, unsigned height)
2305da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2315da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2325da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2335da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_resource_copy_region(struct pipe_context *ctx,
2345da246944a787b933a509f0b65bab466574c3339Jerome Glisse				      struct pipe_resource *dst,
2354c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				      unsigned dst_level,
2365da246944a787b933a509f0b65bab466574c3339Jerome Glisse				      unsigned dstx, unsigned dsty, unsigned dstz,
2375da246944a787b933a509f0b65bab466574c3339Jerome Glisse				      struct pipe_resource *src,
2384c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				      unsigned src_level,
2394c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				      const struct pipe_box *src_box)
2405da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2415da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2425da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2435da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2445da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
2455da246944a787b933a509f0b65bab466574c3339Jerome Glisse * context
2465da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
2477e02303497237cde958c28608477d0c355a8038bMarek Olšákstatic void noop_flush(struct pipe_context *ctx,
2485da246944a787b933a509f0b65bab466574c3339Jerome Glisse			struct pipe_fence_handle **fence)
2495da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2505da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2515da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2525da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_destroy_context(struct pipe_context *ctx)
2535da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2545da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(ctx);
2555da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2565da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2575da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic struct pipe_context *noop_create_context(struct pipe_screen *screen, void *priv)
2585da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2595da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_context *ctx = CALLOC_STRUCT(pipe_context);
2605da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2615da246944a787b933a509f0b65bab466574c3339Jerome Glisse	if (ctx == NULL)
2625da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
2635da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->screen = screen;
2645da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->priv = priv;
2655da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->destroy = noop_destroy_context;
2665da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->flush = noop_flush;
2675da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->clear = noop_clear;
2685da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->clear_render_target = noop_clear_render_target;
2695da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->clear_depth_stencil = noop_clear_depth_stencil;
2705da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->resource_copy_region = noop_resource_copy_region;
2715da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->create_query = noop_create_query;
2725da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->destroy_query = noop_destroy_query;
2735da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->begin_query = noop_begin_query;
2745da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->end_query = noop_end_query;
2755da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->get_query_result = noop_get_query_result;
2765da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->get_transfer = noop_get_transfer;
2775da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_map = noop_transfer_map;
2785da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_flush_region = noop_transfer_flush_region;
2795da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_unmap = noop_transfer_unmap;
2805da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_destroy = noop_transfer_destroy;
2815da246944a787b933a509f0b65bab466574c3339Jerome Glisse	ctx->transfer_inline_write = noop_transfer_inline_write;
2825da246944a787b933a509f0b65bab466574c3339Jerome Glisse	noop_init_state_functions(ctx);
2835da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2845da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return ctx;
2855da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2865da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2875da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2885da246944a787b933a509f0b65bab466574c3339Jerome Glisse/*
2895da246944a787b933a509f0b65bab466574c3339Jerome Glisse * pipe_screen
2905da246944a787b933a509f0b65bab466574c3339Jerome Glisse */
2915da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_flush_frontbuffer(struct pipe_screen *_screen,
2924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				   struct pipe_resource *resource,
2934c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				   unsigned level, unsigned layer,
2944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				   void *context_private)
2955da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
2965da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
2975da246944a787b933a509f0b65bab466574c3339Jerome Glisse
2985da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic const char *noop_get_vendor(struct pipe_screen* pscreen)
2995da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3005da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return "X.Org";
3015da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3025da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3035da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic const char *noop_get_name(struct pipe_screen* pscreen)
3045da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3055da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return "NOOP";
3065da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3075da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3085da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic int noop_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
3095da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
31021c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
31121c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák
31221c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->get_param(screen, param);
3135da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3145da246944a787b933a509f0b65bab466574c3339Jerome Glisse
315bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšákstatic float noop_get_paramf(struct pipe_screen* pscreen,
316bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák			     enum pipe_capf param)
3175da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
31821c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
31921c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák
32021c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->get_paramf(screen, param);
3215da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3225da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3235da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic int noop_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
3245da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
32521c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
3265da246944a787b933a509f0b65bab466574c3339Jerome Glisse
32721c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->get_shader_param(screen, shader, param);
3285da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3295da246944a787b933a509f0b65bab466574c3339Jerome Glisse
33021c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšákstatic boolean noop_is_format_supported(struct pipe_screen* pscreen,
3315da246944a787b933a509f0b65bab466574c3339Jerome Glisse					enum pipe_format format,
3325da246944a787b933a509f0b65bab466574c3339Jerome Glisse					enum pipe_texture_target target,
3335da246944a787b933a509f0b65bab466574c3339Jerome Glisse					unsigned sample_count,
334e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                        unsigned usage)
3355da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
33621c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	struct pipe_screen *screen = ((struct noop_pipe_screen*)pscreen)->oscreen;
33721c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák
33821c5d11b7ee1f6fd9d16752d8921976d9951623dMarek Olšák	return screen->is_format_supported(screen, format, target, sample_count, usage);
3395da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3405da246944a787b933a509f0b65bab466574c3339Jerome Glisse
341e66d90ec6bd927e0a8252c27d69258e126897ad5Marek Olšákstatic uint64_t noop_get_timestamp(struct pipe_screen *pscreen)
342e66d90ec6bd927e0a8252c27d69258e126897ad5Marek Olšák{
343e66d90ec6bd927e0a8252c27d69258e126897ad5Marek Olšák	return 0;
344e66d90ec6bd927e0a8252c27d69258e126897ad5Marek Olšák}
345e66d90ec6bd927e0a8252c27d69258e126897ad5Marek Olšák
3465da246944a787b933a509f0b65bab466574c3339Jerome Glissestatic void noop_destroy_screen(struct pipe_screen *screen)
3475da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3483349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)screen;
3493349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct pipe_screen *oscreen = noop_screen->oscreen;
3503349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse
3513349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	oscreen->destroy(oscreen);
3525da246944a787b933a509f0b65bab466574c3339Jerome Glisse	FREE(screen);
3535da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
3545da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3553349517351059dcd70a81b31bdffe9835bd8f216Jerome Glissestruct pipe_screen *noop_screen_create(struct pipe_screen *oscreen)
3565da246944a787b933a509f0b65bab466574c3339Jerome Glisse{
3573349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	struct noop_pipe_screen *noop_screen;
3585da246944a787b933a509f0b65bab466574c3339Jerome Glisse	struct pipe_screen *screen;
3595da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3603349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	if (!debug_get_option_noop()) {
3613349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse		return oscreen;
3623349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	}
3633349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse
3643349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	noop_screen = CALLOC_STRUCT(noop_pipe_screen);
3653349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	if (noop_screen == NULL) {
3665da246944a787b933a509f0b65bab466574c3339Jerome Glisse		return NULL;
3675da246944a787b933a509f0b65bab466574c3339Jerome Glisse	}
3683349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	noop_screen->oscreen = oscreen;
3693349517351059dcd70a81b31bdffe9835bd8f216Jerome Glisse	screen = &noop_screen->pscreen;
3705da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3715da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->destroy = noop_destroy_screen;
3725da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_name = noop_get_name;
3735da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_vendor = noop_get_vendor;
3745da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_param = noop_get_param;
3755da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_shader_param = noop_get_shader_param;
3765da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->get_paramf = noop_get_paramf;
3775da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->is_format_supported = noop_is_format_supported;
3785da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->context_create = noop_create_context;
3795da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_create = noop_resource_create;
3805da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_from_handle = noop_resource_from_handle;
3815da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_get_handle = noop_resource_get_handle;
3825da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->resource_destroy = noop_resource_destroy;
3835da246944a787b933a509f0b65bab466574c3339Jerome Glisse	screen->flush_frontbuffer = noop_flush_frontbuffer;
384e66d90ec6bd927e0a8252c27d69258e126897ad5Marek Olšák        screen->get_timestamp = noop_get_timestamp;
3855da246944a787b933a509f0b65bab466574c3339Jerome Glisse
3865da246944a787b933a509f0b65bab466574c3339Jerome Glisse	return screen;
3875da246944a787b933a509f0b65bab466574c3339Jerome Glisse}
388