gallium/noop: no operation gallium driver
authorJerome Glisse <jglisse@redhat.com>
Mon, 15 Nov 2010 19:53:21 +0000 (14:53 -0500)
committerJerome Glisse <jglisse@redhat.com>
Mon, 15 Nov 2010 19:56:40 +0000 (14:56 -0500)
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@redhat.com>
configure.ac
src/gallium/drivers/noop/Makefile [new file with mode: 0644]
src/gallium/drivers/noop/SConscript [new file with mode: 0644]
src/gallium/drivers/noop/noop_pipe.c [new file with mode: 0644]
src/gallium/drivers/noop/noop_public.h [new file with mode: 0644]
src/gallium/drivers/noop/noop_state.c [new file with mode: 0644]
src/gallium/targets/dri-noop/Makefile [new file with mode: 0644]
src/gallium/targets/dri-noop/SConscript [new file with mode: 0644]
src/gallium/targets/dri-noop/swrast_drm_api.c [new file with mode: 0644]

index b43a9fd1e86abe59fcd740db8c7e9a2b3e037e99..77e7603520d3c4de739def1e631bdf4a126c475b 100644 (file)
@@ -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 (file)
index 0000000..29b8d73
--- /dev/null
@@ -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 (file)
index 0000000..a4d0dca
--- /dev/null
@@ -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 (file)
index 0000000..a5a4808
--- /dev/null
@@ -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 (file)
index 0000000..8ce82be
--- /dev/null
@@ -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 (file)
index 0000000..048ed42
--- /dev/null
@@ -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 (file)
index 0000000..21c5f4f
--- /dev/null
@@ -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 (file)
index 0000000..9c04ee6
--- /dev/null
@@ -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 (file)
index 0000000..a99779f
--- /dev/null
@@ -0,0 +1,63 @@
+/**************************************************************************
+ *
+ * Copyright 2009, VMware, Inc.
+ * All Rights Reserved.
+ * Copyright 2010 George Sapountzis <gsapountzis@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: */