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>tags/android-x86-2.2
@@ -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" | |||
@@ -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 |
@@ -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') |
@@ -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; | |||
} |
@@ -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 |
@@ -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; | |||
} |
@@ -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: |
@@ -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) |
@@ -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: */ |