Mesa (master): gallium/noop: no operation gallium driver

Jerome Glisse glisse at kemper.freedesktop.org
Mon Nov 15 19:57:05 UTC 2010


Module: Mesa
Branch: master
Commit: 5da246944a787b933a509f0b65bab466574c3339
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5da246944a787b933a509f0b65bab466574c3339

Author: Jerome Glisse <jglisse at redhat.com>
Date:   Mon Nov 15 14:53:21 2010 -0500

gallium/noop: no operation gallium driver

This driver is a fake swdri driver that perform no operations
beside allocation gallium structure and buffer for upper layer
usage.

It's purpose is to help profiling core mesa/gallium without
having pipe driver overhead hidding hot spot of core code.

scons file are likely inadequate i am unfamiliar with this
build system.

To use it simply rename is to swrast_dri.so and properly set
LIBGL_DRIVERS_PATH env variable.

Signed-off-by: Jerome Glisse <jglisse at redhat.com>

---

 configure.ac                                  |   13 +
 src/gallium/drivers/noop/Makefile             |   13 +
 src/gallium/drivers/noop/SConscript           |   15 +
 src/gallium/drivers/noop/noop_pipe.c          |  547 +++++++++++++++++++++++++
 src/gallium/drivers/noop/noop_public.h        |   30 ++
 src/gallium/drivers/noop/noop_state.c         |  256 ++++++++++++
 src/gallium/targets/dri-noop/Makefile         |   34 ++
 src/gallium/targets/dri-noop/SConscript       |   31 ++
 src/gallium/targets/dri-noop/swrast_drm_api.c |   63 +++
 9 files changed, 1002 insertions(+), 0 deletions(-)

diff --git a/configure.ac b/configure.ac
index b43a9fd..77e7603 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1708,6 +1708,19 @@ if test "x$enable_gallium_swrast" = xyes || test "x$enable_gallium_swrast" = xau
     fi
 fi
 
+dnl
+dnl Gallium noop configuration
+dnl
+AC_ARG_ENABLE([gallium-noop],
+    [AS_HELP_STRING([--enable-gallium-noop],
+        [build gallium radeon @<:@default=disabled@:>@])],
+    [enable_gallium_noop="$enableval"],
+    [enable_gallium_noop=auto])
+if test "x$enable_gallium_noop" = xyes; then
+    GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS noop"
+    GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS dri-noop"
+fi
+
 dnl prepend CORE_DIRS to SRC_DIRS
 SRC_DIRS="$CORE_DIRS $SRC_DIRS"
 
diff --git a/src/gallium/drivers/noop/Makefile b/src/gallium/drivers/noop/Makefile
new file mode 100644
index 0000000..29b8d73
--- /dev/null
+++ b/src/gallium/drivers/noop/Makefile
@@ -0,0 +1,13 @@
+# Meta-driver which combines whichever software rasterizers have been
+# built into a single convenience library.
+
+TOP = ../../../..
+include $(TOP)/configs/current
+
+LIBNAME = noop
+
+C_SOURCES = \
+	noop_pipe.c \
+	noop_state.c
+
+include ../../Makefile.template
diff --git a/src/gallium/drivers/noop/SConscript b/src/gallium/drivers/noop/SConscript
new file mode 100644
index 0000000..a4d0dca
--- /dev/null
+++ b/src/gallium/drivers/noop/SConscript
@@ -0,0 +1,15 @@
+#######################################################################
+# SConscript for noop convenience library
+
+Import('*')
+
+env = env.Clone()
+
+noop = env.ConvenienceLibrary(
+	target = 'noop',
+	source = [
+		'noop_pipe.c',
+		'noop_state.c'
+		]
+    ) + extra
+Export('noop')
diff --git a/src/gallium/drivers/noop/noop_pipe.c b/src/gallium/drivers/noop/noop_pipe.c
new file mode 100644
index 0000000..a5a4808
--- /dev/null
+++ b/src/gallium/drivers/noop/noop_pipe.c
@@ -0,0 +1,547 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <stdio.h>
+#include <errno.h>
+#include <pipe/p_defines.h>
+#include <pipe/p_state.h>
+#include <pipe/p_context.h>
+#include <pipe/p_screen.h>
+#include <util/u_memory.h>
+#include <util/u_inlines.h>
+#include <util/u_format.h>
+#include "noop_public.h"
+#include "state_tracker/sw_winsys.h"
+
+void noop_init_state_functions(struct pipe_context *ctx);
+
+/*
+ * query
+ */
+struct noop_query {
+	unsigned	query;
+};
+static struct pipe_query *noop_create_query(struct pipe_context *ctx, unsigned query_type)
+{
+	struct noop_query *query = CALLOC_STRUCT(noop_query);
+
+	return (struct pipe_query *)query;
+}
+
+static void noop_destroy_query(struct pipe_context *ctx, struct pipe_query *query)
+{
+	FREE(query);
+}
+
+static void noop_begin_query(struct pipe_context *ctx, struct pipe_query *query)
+{
+}
+
+static void noop_end_query(struct pipe_context *ctx, struct pipe_query *query)
+{
+}
+
+static boolean noop_get_query_result(struct pipe_context *ctx,
+					struct pipe_query *query,
+					boolean wait, void *vresult)
+{
+	uint64_t *result = (uint64_t*)vresult;
+
+	*result = 0;
+	return TRUE;
+}
+
+
+/*
+ * resource
+ */
+struct noop_resource {
+	struct pipe_resource	base;
+	unsigned		size;
+	char			*data;
+	struct sw_displaytarget	*dt;
+};
+
+static unsigned noop_is_resource_referenced(struct pipe_context *pipe,
+						struct pipe_resource *resource,
+						unsigned face, unsigned level)
+{
+	return PIPE_UNREFERENCED;
+}
+
+static struct pipe_resource *noop_resource_create(struct pipe_screen *screen,
+						const struct pipe_resource *templ)
+{
+	struct noop_resource *nresource;
+	unsigned stride;
+
+	nresource = CALLOC_STRUCT(noop_resource);
+	if (nresource == NULL)
+		return NULL;
+
+	stride = util_format_get_stride(templ->format, templ->width0);
+	nresource->base = *templ;
+	nresource->base.screen = screen;
+	nresource->size = stride * templ->height0 * templ->depth0;
+	nresource->data = malloc(nresource->size);
+	pipe_reference_init(&nresource->base.reference, 1);
+	if (nresource->data == NULL) {
+		FREE(nresource);
+		return NULL;
+	}
+#if 0
+	if (nresource->base.bind & (PIPE_BIND_DISPLAY_TARGET |
+					PIPE_BIND_SCANOUT |
+					PIPE_BIND_SHARED)) {
+		struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
+		unsigned stride;
+
+		nresource->dt = winsys->displaytarget_create(winsys, nresource->base.bind,
+								nresource->base.format,
+								nresource->base.width0, 
+								nresource->base.height0,
+								16, &stride);
+	}
+#endif
+	return &nresource->base;
+}
+
+static struct pipe_resource *noop_resource_from_handle(struct pipe_screen * screen,
+							const struct pipe_resource *templ,
+							struct winsys_handle *whandle)
+{
+	struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
+	struct noop_resource *nresource;
+	struct sw_displaytarget *dt;
+	unsigned stride;
+
+	dt = winsys->displaytarget_from_handle(winsys, templ, whandle, &stride);
+	if (dt == NULL) {
+		return NULL;
+	}
+	nresource = (struct noop_resource *)noop_resource_create(screen, templ);
+	nresource->dt = dt;
+	return &nresource->base;
+}
+
+static boolean noop_resource_get_handle(struct pipe_screen *screen,
+					struct pipe_resource *resource,
+					struct winsys_handle *handle)
+{
+	struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
+	struct noop_resource *nresource = (struct noop_resource *)resource;
+
+	if (nresource->dt == NULL)
+		return FALSE;
+
+	return winsys->displaytarget_get_handle(winsys, nresource->dt, handle);
+}
+
+static void noop_resource_destroy(struct pipe_screen *screen,
+					struct pipe_resource *resource)
+{
+	struct noop_resource *nresource = (struct noop_resource *)resource;
+
+	if (nresource->dt) {
+		/* display target */
+		struct sw_winsys *winsys = (struct sw_winsys *)screen->winsys;
+		winsys->displaytarget_destroy(winsys, nresource->dt);
+	}
+	free(nresource->data);
+	FREE(resource);
+}
+
+static struct pipe_resource *noop_user_buffer_create(struct pipe_screen *screen,
+							void *ptr, unsigned bytes,
+							unsigned bind)
+{
+	struct pipe_resource templ;
+
+	templ.target = PIPE_BUFFER;
+	templ.format = PIPE_FORMAT_R8_UNORM;
+	templ.usage = PIPE_USAGE_IMMUTABLE;
+	templ.bind = bind;
+	templ.width0 = bytes;
+	templ.height0 = 1;
+	templ.depth0 = 1;
+	templ.flags = 0;
+	return noop_resource_create(screen, &templ);
+}
+
+
+/*
+ * transfer
+ */
+static struct pipe_transfer *noop_get_transfer(struct pipe_context *context,
+						struct pipe_resource *resource,
+						struct pipe_subresource sr,
+						enum pipe_transfer_usage usage,
+						const struct pipe_box *box)
+{
+	struct pipe_transfer *transfer;
+
+	transfer = CALLOC_STRUCT(pipe_transfer);
+	if (transfer == NULL)
+		return NULL;
+	pipe_resource_reference(&transfer->resource, resource);
+	transfer->sr = sr;
+	transfer->usage = usage;
+	transfer->box = *box;
+	transfer->stride = 1;
+	transfer->slice_stride = 1;
+	return transfer;
+}
+
+static void *noop_transfer_map(struct pipe_context *pipe,
+				struct pipe_transfer *transfer)
+{
+	struct noop_resource *nresource = (struct noop_resource *)transfer->resource;
+
+	return nresource->data;
+}
+
+static void noop_transfer_flush_region(struct pipe_context *pipe,
+					struct pipe_transfer *transfer,
+					const struct pipe_box *box)
+{
+}
+
+static void noop_transfer_unmap(struct pipe_context *pipe,
+				struct pipe_transfer *transfer)
+{
+}
+
+static void noop_transfer_destroy(struct pipe_context *pipe,
+					struct pipe_transfer *transfer)
+{
+	pipe_resource_reference(&transfer->resource, NULL);
+	FREE(transfer);
+}
+
+static void noop_transfer_inline_write(struct pipe_context *pipe,
+					struct pipe_resource *resource,
+					struct pipe_subresource sr,
+					unsigned usage,
+					const struct pipe_box *box,
+					const void *data,
+					unsigned stride,
+					unsigned slice_stride)
+{
+}
+
+
+/*
+ * clear/copy
+ */
+static void noop_clear(struct pipe_context *ctx, unsigned buffers,
+			const float *rgba, double depth, unsigned stencil)
+{
+}
+
+static void noop_clear_render_target(struct pipe_context *ctx,
+				     struct pipe_surface *dst,
+				     const float *rgba,
+				     unsigned dstx, unsigned dsty,
+				     unsigned width, unsigned height)
+{
+}
+
+static void noop_clear_depth_stencil(struct pipe_context *ctx,
+				     struct pipe_surface *dst,
+				     unsigned clear_flags,
+				     double depth,
+				     unsigned stencil,
+				     unsigned dstx, unsigned dsty,
+				     unsigned width, unsigned height)
+{
+}
+
+static void noop_resource_copy_region(struct pipe_context *ctx,
+				      struct pipe_resource *dst,
+				      struct pipe_subresource subdst,
+				      unsigned dstx, unsigned dsty, unsigned dstz,
+				      struct pipe_resource *src,
+				      struct pipe_subresource subsrc,
+				      unsigned srcx, unsigned srcy, unsigned srcz,
+				      unsigned width, unsigned height)
+{
+}
+
+
+/*
+ * context
+ */
+static void noop_flush(struct pipe_context *ctx, unsigned flags,
+			struct pipe_fence_handle **fence)
+{
+}
+
+static void noop_destroy_context(struct pipe_context *ctx)
+{
+	FREE(ctx);
+}
+
+static struct pipe_context *noop_create_context(struct pipe_screen *screen, void *priv)
+{
+	struct pipe_context *ctx = CALLOC_STRUCT(pipe_context);
+
+	if (ctx == NULL)
+		return NULL;
+	ctx->winsys = screen->winsys;
+	ctx->screen = screen;
+	ctx->priv = priv;
+	ctx->destroy = noop_destroy_context;
+	ctx->flush = noop_flush;
+	ctx->clear = noop_clear;
+	ctx->clear_render_target = noop_clear_render_target;
+	ctx->clear_depth_stencil = noop_clear_depth_stencil;
+	ctx->resource_copy_region = noop_resource_copy_region;
+	ctx->create_query = noop_create_query;
+	ctx->destroy_query = noop_destroy_query;
+	ctx->begin_query = noop_begin_query;
+	ctx->end_query = noop_end_query;
+	ctx->get_query_result = noop_get_query_result;
+	ctx->get_transfer = noop_get_transfer;
+	ctx->transfer_map = noop_transfer_map;
+	ctx->transfer_flush_region = noop_transfer_flush_region;
+	ctx->transfer_unmap = noop_transfer_unmap;
+	ctx->transfer_destroy = noop_transfer_destroy;
+	ctx->transfer_inline_write = noop_transfer_inline_write;
+	ctx->is_resource_referenced = noop_is_resource_referenced;
+	noop_init_state_functions(ctx);
+
+	return ctx;
+}
+
+/*
+ * texture
+ */
+static struct pipe_surface *noop_get_tex_surface(struct pipe_screen *screen,
+						struct pipe_resource *texture,
+						unsigned face, unsigned level,
+						unsigned zslice, unsigned flags)
+{
+	struct pipe_surface *surface = CALLOC_STRUCT(pipe_surface);
+
+	if (surface == NULL)
+		return NULL;
+	pipe_reference_init(&surface->reference, 1);
+	pipe_resource_reference(&surface->texture, texture);
+	surface->format = texture->format;
+	surface->width = texture->width0;
+	surface->height = texture->height0;
+	surface->offset = 0;
+	surface->usage = flags;
+	surface->zslice = zslice;
+	surface->texture = texture;
+	surface->face = face;
+	surface->level = level;
+
+	return surface;
+}
+
+static void noop_tex_surface_destroy(struct pipe_surface *surface)
+{
+	pipe_resource_reference(&surface->texture, NULL);
+	FREE(surface);
+}
+
+
+/*
+ * pipe_screen
+ */
+static void noop_flush_frontbuffer(struct pipe_screen *_screen,
+					struct pipe_surface *surface,
+					void *context_private)
+{
+}
+
+static const char *noop_get_vendor(struct pipe_screen* pscreen)
+{
+	return "X.Org";
+}
+
+static const char *noop_get_name(struct pipe_screen* pscreen)
+{
+	return "NOOP";
+}
+
+static int noop_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
+{
+	switch (param) {
+	/* Supported features (boolean caps). */
+	case PIPE_CAP_NPOT_TEXTURES:
+	case PIPE_CAP_TWO_SIDED_STENCIL:
+	case PIPE_CAP_GLSL:
+	case PIPE_CAP_DUAL_SOURCE_BLEND:
+	case PIPE_CAP_ANISOTROPIC_FILTER:
+	case PIPE_CAP_POINT_SPRITE:
+	case PIPE_CAP_OCCLUSION_QUERY:
+	case PIPE_CAP_TEXTURE_SHADOW_MAP:
+	case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
+	case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
+	case PIPE_CAP_BLEND_EQUATION_SEPARATE:
+	case PIPE_CAP_SM3:
+	case PIPE_CAP_TEXTURE_SWIZZLE:
+	case PIPE_CAP_INDEP_BLEND_ENABLE:
+	case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
+	case PIPE_CAP_DEPTH_CLAMP:
+	case PIPE_CAP_SHADER_STENCIL_EXPORT:
+	case PIPE_CAP_TIMER_QUERY:
+	case PIPE_CAP_STREAM_OUTPUT:
+	case PIPE_CAP_PRIMITIVE_RESTART:
+	case PIPE_CAP_INDEP_BLEND_FUNC:
+		return 0;
+
+	/* Texturing. */
+	case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+	case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
+	case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
+		return 14;
+	case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
+		return 16;
+	case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
+	case PIPE_CAP_MAX_COMBINED_SAMPLERS:
+		return 16;
+
+	/* Render targets. */
+	case PIPE_CAP_MAX_RENDER_TARGETS:
+		return 8;
+
+	/* Fragment coordinate conventions. */
+	case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
+	case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
+		return 1;
+	case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
+	case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
+		return 0;
+
+	default:
+		return 0;
+	}
+}
+
+static float noop_get_paramf(struct pipe_screen* pscreen, enum pipe_cap param)
+{
+	switch (param) {
+	case PIPE_CAP_MAX_LINE_WIDTH:
+	case PIPE_CAP_MAX_LINE_WIDTH_AA:
+	case PIPE_CAP_MAX_POINT_WIDTH:
+	case PIPE_CAP_MAX_POINT_WIDTH_AA:
+		return 8192.0f;
+	case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
+		return 16.0f;
+	case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
+		return 16.0f;
+	default:
+		return 0.0f;
+	}
+}
+
+static int noop_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enum pipe_shader_cap param)
+{
+	switch(shader)
+	{
+	case PIPE_SHADER_FRAGMENT:
+	case PIPE_SHADER_VERTEX:
+	case PIPE_SHADER_GEOMETRY:
+		break;
+	default:
+		return 0;
+	}
+
+	switch (param) {
+	case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
+	case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
+	case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
+	case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
+		return 16384;
+	case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
+		return 8;
+	case PIPE_SHADER_CAP_MAX_INPUTS:
+		return 16;
+	case PIPE_SHADER_CAP_MAX_TEMPS:
+		return 256;
+	case PIPE_SHADER_CAP_MAX_ADDRS:
+		return 1;
+	case PIPE_SHADER_CAP_MAX_CONSTS:
+		return 256;
+	case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
+		return 1;
+	case PIPE_SHADER_CAP_MAX_PREDS:
+		return 0;
+	case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
+		return 1;
+	case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
+	case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
+	case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
+	case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
+		return 1;
+	default:
+		return 0;
+	}
+}
+
+static boolean noop_is_format_supported(struct pipe_screen* screen,
+					enum pipe_format format,
+					enum pipe_texture_target target,
+					unsigned sample_count,
+					unsigned usage,
+					unsigned geom_flags)
+{
+	return true;
+}
+
+static void noop_destroy_screen(struct pipe_screen *screen)
+{
+	FREE(screen);
+}
+
+struct pipe_screen *noop_screen_create(struct sw_winsys *winsys)
+{
+	struct pipe_screen *screen;
+
+	screen = CALLOC_STRUCT(pipe_screen);
+	if (screen == NULL) {
+		return NULL;
+	}
+
+	screen->winsys = (struct pipe_winsys*)winsys;
+	screen->destroy = noop_destroy_screen;
+	screen->get_name = noop_get_name;
+	screen->get_vendor = noop_get_vendor;
+	screen->get_param = noop_get_param;
+	screen->get_shader_param = noop_get_shader_param;
+	screen->get_paramf = noop_get_paramf;
+	screen->is_format_supported = noop_is_format_supported;
+	screen->context_create = noop_create_context;
+	screen->get_tex_surface = noop_get_tex_surface;
+	screen->tex_surface_destroy = noop_tex_surface_destroy;
+	screen->resource_create = noop_resource_create;
+	screen->resource_from_handle = noop_resource_from_handle;
+	screen->resource_get_handle = noop_resource_get_handle;
+	screen->resource_destroy = noop_resource_destroy;
+	screen->user_buffer_create = noop_user_buffer_create;
+	screen->flush_frontbuffer = noop_flush_frontbuffer;
+
+	return screen;
+}
diff --git a/src/gallium/drivers/noop/noop_public.h b/src/gallium/drivers/noop/noop_public.h
new file mode 100644
index 0000000..8ce82be
--- /dev/null
+++ b/src/gallium/drivers/noop/noop_public.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef NOOP_PUBLIC_H
+#define NOOP_PUBLIC_H
+
+struct sw_winsys;
+
+struct pipe_screen *noop_screen_create(struct sw_winsys *winsys);
+
+#endif
diff --git a/src/gallium/drivers/noop/noop_state.c b/src/gallium/drivers/noop/noop_state.c
new file mode 100644
index 0000000..048ed42
--- /dev/null
+++ b/src/gallium/drivers/noop/noop_state.c
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2010 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include <stdio.h>
+#include <errno.h>
+#include <pipe/p_defines.h>
+#include <pipe/p_state.h>
+#include <pipe/p_context.h>
+#include <pipe/p_screen.h>
+#include <util/u_memory.h>
+#include <util/u_inlines.h>
+
+static void noop_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
+{
+}
+
+static void noop_set_blend_color(struct pipe_context *ctx,
+					const struct pipe_blend_color *state)
+{
+}
+
+static void *noop_create_blend_state(struct pipe_context *ctx,
+					const struct pipe_blend_state *state)
+{
+	struct pipe_blend_state *nstate = CALLOC_STRUCT(pipe_blend_state);
+
+	if (nstate == NULL) {
+		return NULL;
+	}
+	*nstate = *state;
+	return nstate;
+}
+
+static void *noop_create_dsa_state(struct pipe_context *ctx,
+				   const struct pipe_depth_stencil_alpha_state *state)
+{
+	struct pipe_depth_stencil_alpha_state *nstate = CALLOC_STRUCT(pipe_depth_stencil_alpha_state);
+
+	if (nstate == NULL) {
+		return NULL;
+	}
+	*nstate = *state;
+	return nstate;
+}
+
+static void *noop_create_rs_state(struct pipe_context *ctx,
+					const struct pipe_rasterizer_state *state)
+{
+	struct pipe_rasterizer_state *nstate = CALLOC_STRUCT(pipe_rasterizer_state);
+
+	if (nstate == NULL) {
+		return NULL;
+	}
+	*nstate = *state;
+	return nstate;
+}
+
+static void *noop_create_sampler_state(struct pipe_context *ctx,
+					const struct pipe_sampler_state *state)
+{
+	struct pipe_sampler_state *nstate = CALLOC_STRUCT(pipe_sampler_state);
+
+	if (nstate == NULL) {
+		return NULL;
+	}
+	*nstate = *state;
+	return nstate;
+}
+
+static struct pipe_sampler_view *noop_create_sampler_view(struct pipe_context *ctx,
+							struct pipe_resource *texture,
+							const struct pipe_sampler_view *state)
+{
+	struct pipe_sampler_view *sampler_view = CALLOC_STRUCT(pipe_sampler_view);
+
+	if (sampler_view == NULL)
+		return NULL;
+	/* initialize base object */
+	pipe_resource_reference(&sampler_view->texture, texture);
+	pipe_reference_init(&sampler_view->reference, 1);
+	sampler_view->context = ctx;
+	return sampler_view;
+}
+
+static void noop_set_vs_sampler_view(struct pipe_context *ctx, unsigned count,
+					struct pipe_sampler_view **views)
+{
+}
+
+static void noop_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
+					struct pipe_sampler_view **views)
+{
+}
+
+static void noop_bind_sampler(struct pipe_context *ctx, unsigned count, void **states)
+{
+}
+
+static void noop_set_clip_state(struct pipe_context *ctx,
+				const struct pipe_clip_state *state)
+{
+}
+
+static void noop_set_polygon_stipple(struct pipe_context *ctx,
+					 const struct pipe_poly_stipple *state)
+{
+}
+
+static void noop_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
+{
+}
+
+static void noop_set_scissor_state(struct pipe_context *ctx,
+					const struct pipe_scissor_state *state)
+{
+}
+
+static void noop_set_stencil_ref(struct pipe_context *ctx,
+				const struct pipe_stencil_ref *state)
+{
+}
+
+static void noop_set_viewport_state(struct pipe_context *ctx,
+					const struct pipe_viewport_state *state)
+{
+}
+
+static void noop_set_framebuffer_state(struct pipe_context *ctx,
+					const struct pipe_framebuffer_state *state)
+{
+}
+
+static void noop_set_constant_buffer(struct pipe_context *ctx,
+					uint shader, uint index,
+					struct pipe_resource *buffer)
+{
+}
+
+
+static void noop_sampler_view_destroy(struct pipe_context *ctx,
+				struct pipe_sampler_view *state)
+{
+	pipe_resource_reference(&state->texture, NULL);
+	FREE(state);
+}
+
+static void noop_bind_state(struct pipe_context *ctx, void *state)
+{
+}
+
+static void noop_delete_state(struct pipe_context *ctx, void *state)
+{
+	FREE(state);
+}
+
+static void noop_delete_vertex_element(struct pipe_context *ctx, void *state)
+{
+	FREE(state);
+}
+
+
+static void noop_set_index_buffer(struct pipe_context *ctx,
+					const struct pipe_index_buffer *ib)
+{
+}
+
+static void noop_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
+					const struct pipe_vertex_buffer *buffers)
+{
+}
+
+static void *noop_create_vertex_elements(struct pipe_context *ctx,
+					unsigned count,
+					const struct pipe_vertex_element *state)
+{
+	struct pipe_vertex_element *nstate = CALLOC_STRUCT(pipe_vertex_element);
+
+	if (nstate == NULL) {
+		return NULL;
+	}
+	*nstate = *state;
+	return nstate;
+}
+
+static void *noop_create_shader_state(struct pipe_context *ctx,
+					const struct pipe_shader_state *state)
+{
+	struct pipe_shader_state *nstate = CALLOC_STRUCT(pipe_shader_state);
+
+	if (nstate == NULL) {
+		return NULL;
+	}
+	*nstate = *state;
+	return nstate;
+}
+
+void noop_init_state_functions(struct pipe_context *ctx)
+{
+	ctx->create_blend_state = noop_create_blend_state;
+	ctx->create_depth_stencil_alpha_state = noop_create_dsa_state;
+	ctx->create_fs_state = noop_create_shader_state;
+	ctx->create_rasterizer_state = noop_create_rs_state;
+	ctx->create_sampler_state = noop_create_sampler_state;
+	ctx->create_sampler_view = noop_create_sampler_view;
+	ctx->create_vertex_elements_state = noop_create_vertex_elements;
+	ctx->create_vs_state = noop_create_shader_state;
+	ctx->bind_blend_state = noop_bind_state;
+	ctx->bind_depth_stencil_alpha_state = noop_bind_state;
+	ctx->bind_fragment_sampler_states = noop_bind_sampler;
+	ctx->bind_fs_state = noop_bind_state;
+	ctx->bind_rasterizer_state = noop_bind_state;
+	ctx->bind_vertex_elements_state = noop_bind_state;
+	ctx->bind_vertex_sampler_states = noop_bind_sampler;
+	ctx->bind_vs_state = noop_bind_state;
+	ctx->delete_blend_state = noop_delete_state;
+	ctx->delete_depth_stencil_alpha_state = noop_delete_state;
+	ctx->delete_fs_state = noop_delete_state;
+	ctx->delete_rasterizer_state = noop_delete_state;
+	ctx->delete_sampler_state = noop_delete_state;
+	ctx->delete_vertex_elements_state = noop_delete_vertex_element;
+	ctx->delete_vs_state = noop_delete_state;
+	ctx->set_blend_color = noop_set_blend_color;
+	ctx->set_clip_state = noop_set_clip_state;
+	ctx->set_constant_buffer = noop_set_constant_buffer;
+	ctx->set_fragment_sampler_views = noop_set_ps_sampler_view;
+	ctx->set_framebuffer_state = noop_set_framebuffer_state;
+	ctx->set_polygon_stipple = noop_set_polygon_stipple;
+	ctx->set_sample_mask = noop_set_sample_mask;
+	ctx->set_scissor_state = noop_set_scissor_state;
+	ctx->set_stencil_ref = noop_set_stencil_ref;
+	ctx->set_vertex_buffers = noop_set_vertex_buffers;
+	ctx->set_index_buffer = noop_set_index_buffer;
+	ctx->set_vertex_sampler_views = noop_set_vs_sampler_view;
+	ctx->set_viewport_state = noop_set_viewport_state;
+	ctx->sampler_view_destroy = noop_sampler_view_destroy;
+	ctx->draw_vbo = noop_draw_vbo;
+}
diff --git a/src/gallium/targets/dri-noop/Makefile b/src/gallium/targets/dri-noop/Makefile
new file mode 100644
index 0000000..21c5f4f
--- /dev/null
+++ b/src/gallium/targets/dri-noop/Makefile
@@ -0,0 +1,34 @@
+TOP = ../../../..
+include $(TOP)/configs/current
+
+LIBNAME = noop_dri.so
+
+DRIVER_DEFINES = \
+	-D__NOT_HAVE_DRM_H
+
+PIPE_DRIVERS = \
+	$(TOP)/src/gallium/state_trackers/dri/sw/libdrisw.a \
+	$(TOP)/src/gallium/winsys/sw/dri/libswdri.a \
+	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+	$(TOP)/src/gallium/drivers/trace/libtrace.a \
+	$(TOP)/src/gallium/drivers/rbug/librbug.a \
+	$(TOP)/src/gallium/drivers/noop/libnoop.a
+
+SWRAST_COMMON_GALLIUM_SOURCES = \
+	$(TOP)/src/mesa/drivers/dri/common/utils.c \
+	$(TOP)/src/mesa/drivers/dri/common/drisw_util.c \
+	$(TOP)/src/mesa/drivers/dri/common/xmlconfig.c
+
+C_SOURCES = \
+	swrast_drm_api.c \
+	$(SWRAST_COMMON_GALLIUM_SOURCES) \
+	$(DRIVER_SOURCES)
+
+ASM_SOURCES =
+
+include ../Makefile.dri
+
+INCLUDES += \
+	-I$(TOP)/src/gallium/winsys/sw/dri
+
+symlinks:
diff --git a/src/gallium/targets/dri-noop/SConscript b/src/gallium/targets/dri-noop/SConscript
new file mode 100644
index 0000000..9c04ee6
--- /dev/null
+++ b/src/gallium/targets/dri-noop/SConscript
@@ -0,0 +1,31 @@
+Import('*')
+
+env = drienv.Clone()
+
+env.Append(CPPPATH = [
+    '#/src/gallium/winsys/sw/dri',
+])
+
+env.Prepend(LIBS = [
+    st_drisw,
+    ws_dri,
+    noop,
+    mesa,
+    glsl,
+    gallium,
+    COMMON_DRI_SW_OBJECTS
+])
+
+env.Prepend(LIBS = [noop])
+
+swrastg_sources = [
+    'swrast_drm_api.c'
+]
+
+module = env.LoadableModule(
+    target ='noop_dri.so',
+    source = swrastg_sources,
+    SHLIBPREFIX = '',
+)
+
+env.Alias('dri-noop', module)
diff --git a/src/gallium/targets/dri-noop/swrast_drm_api.c b/src/gallium/targets/dri-noop/swrast_drm_api.c
new file mode 100644
index 0000000..a99779f
--- /dev/null
+++ b/src/gallium/targets/dri-noop/swrast_drm_api.c
@@ -0,0 +1,63 @@
+/**************************************************************************
+ *
+ * Copyright 2009, VMware, Inc.
+ * All Rights Reserved.
+ * Copyright 2010 George Sapountzis <gsapountzis at gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include "pipe/p_compiler.h"
+#include "util/u_memory.h"
+#include "dri_sw_winsys.h"
+#include "noop/noop_public.h"
+
+#include "target-helpers/inline_debug_helper.h"
+#include "target-helpers/inline_sw_helper.h"
+
+
+struct pipe_screen *
+drisw_create_screen(struct drisw_loader_funcs *lf)
+{
+   struct sw_winsys *winsys = NULL;
+   struct pipe_screen *screen = NULL;
+
+   winsys = dri_create_sw_winsys(lf);
+   if (winsys == NULL)
+      return NULL;
+
+   screen = noop_screen_create(winsys);
+   if (!screen)
+      goto fail;
+
+   screen = debug_screen_wrap(screen);
+
+   return screen;
+
+fail:
+   if (winsys)
+      winsys->destroy(winsys);
+
+   return NULL;
+}
+
+/* vim: set sw=3 ts=8 sts=3 expandtab: */




More information about the mesa-commit mailing list