identity: Add new identity driver

This driver does no transformation of the gallium calls
	going to the real driver, like the identity matrix. It is
	intended to be the basis for transforming and/or debug
	drivers like trace and rbug.

	Authors of this patch are:
		Michal Krol, orignal heavy lifting.
		José Fonesca, object wrapping code stolen from trace.
		Jakob Bornecrantz, put it all toghether and renamed a stuff.
This commit is contained in:
Jakob Bornecrantz
2009-06-24 02:42:41 +02:00
parent b8e638d489
commit d60b2c6855
12 changed files with 1716 additions and 5 deletions

View File

@@ -32,10 +32,10 @@ import common
default_statetrackers = 'mesa'
if common.default_platform in ('linux', 'freebsd', 'darwin'):
default_drivers = 'softpipe,failover,i915simple,trace'
default_drivers = 'softpipe,failover,i915simple,trace,identity'
default_winsys = 'xlib'
elif common.default_platform in ('winddk',):
default_drivers = 'softpipe,i915simple,trace'
default_drivers = 'softpipe,i915simple,trace,identity'
default_winsys = 'all'
else:
default_drivers = 'all'
@@ -46,7 +46,7 @@ common.AddOptions(opts)
opts.Add(ListVariable('statetrackers', 'state trackers to build', default_statetrackers,
['mesa', 'python']))
opts.Add(ListVariable('drivers', 'pipe drivers to build', default_drivers,
['softpipe', 'failover', 'i915simple', 'i965simple', 'cell', 'trace', 'r300']))
['softpipe', 'failover', 'i915simple', 'i965simple', 'cell', 'trace', 'r300', 'identity']))
opts.Add(ListVariable('winsys', 'winsys drivers to build', default_winsys,
['xlib', 'intel', 'gdi', 'radeon']))

View File

@@ -95,7 +95,7 @@ EGL_DRIVERS_DIRS = demo
GALLIUM_DIRS = auxiliary drivers state_trackers
GALLIUM_AUXILIARY_DIRS = rbug draw translate cso_cache pipebuffer tgsi sct rtasm util indices
GALLIUM_AUXILIARIES = $(foreach DIR,$(GALLIUM_AUXILIARY_DIRS),$(TOP)/src/gallium/auxiliary/$(DIR)/lib$(DIR).a)
GALLIUM_DRIVERS_DIRS = softpipe i915simple failover trace
GALLIUM_DRIVERS_DIRS = softpipe i915simple failover trace identity
GALLIUM_DRIVERS = $(foreach DIR,$(GALLIUM_DRIVERS_DIRS),$(TOP)/src/gallium/drivers/$(DIR)/lib$(DIR).a)
GALLIUM_WINSYS_DIRS = xlib egl_xlib
GALLIUM_WINSYS_DRM_DIRS =

View File

@@ -417,7 +417,7 @@ GALLIUM_DIRS="auxiliary drivers state_trackers"
GALLIUM_WINSYS_DIRS=""
GALLIUM_WINSYS_DRM_DIRS=""
GALLIUM_AUXILIARY_DIRS="rbug draw translate cso_cache pipebuffer tgsi sct rtasm util indices"
GALLIUM_DRIVERS_DIRS="softpipe failover trace"
GALLIUM_DRIVERS_DIRS="softpipe failover trace identity"
GALLIUM_STATE_TRACKERS_DIRS=""
case "$mesa_driver" in

View File

@@ -0,0 +1,11 @@
TOP = ../../../..
include $(TOP)/configs/current
LIBNAME = identity
C_SOURCES = \
id_objects.c \
id_context.c \
id_screen.c
include ../../Makefile.template

View File

@@ -0,0 +1,13 @@
Import('*')
env = env.Clone()
identity = env.ConvenienceLibrary(
target = 'identity',
source = [
'id_screen.c',
'id_context.c',
'id_objects.c',
])
Export('identity')

View File

@@ -0,0 +1,719 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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_context.h"
#include "util/u_memory.h"
#include "id_public.h"
#include "id_context.h"
#include "id_objects.h"
static void
identity_destroy(struct pipe_context *_pipe)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->destroy(pipe);
free(id_pipe);
}
static void
identity_set_edgeflags(struct pipe_context *_pipe,
const unsigned *bitfield)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_edgeflags(pipe,
bitfield);
}
static boolean
identity_draw_arrays(struct pipe_context *_pipe,
unsigned prim,
unsigned start,
unsigned count)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->draw_arrays(pipe,
prim,
start,
count);
}
static boolean
identity_draw_elements(struct pipe_context *_pipe,
struct pipe_buffer *_indexBuffer,
unsigned indexSize,
unsigned prim,
unsigned start,
unsigned count)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct identity_buffer *id_buffer = identity_buffer(_indexBuffer);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_buffer *indexBuffer = id_buffer->buffer;
return pipe->draw_elements(pipe,
indexBuffer,
indexSize,
prim,
start,
count);
}
static boolean
identity_draw_range_elements(struct pipe_context *_pipe,
struct pipe_buffer *_indexBuffer,
unsigned indexSize,
unsigned minIndex,
unsigned maxIndex,
unsigned mode,
unsigned start,
unsigned count)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct identity_buffer *id_buffer = identity_buffer(_indexBuffer);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_buffer *indexBuffer = id_buffer->buffer;
return pipe->draw_range_elements(pipe,
indexBuffer,
indexSize,
minIndex,
maxIndex,
mode,
start,
count);
}
static struct pipe_query *
identity_create_query(struct pipe_context *_pipe,
unsigned query_type)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_query(pipe,
query_type);
}
static void
identity_destroy_query(struct pipe_context *_pipe,
struct pipe_query *query)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->destroy_query(pipe,
query);
}
static void
identity_begin_query(struct pipe_context *_pipe,
struct pipe_query *query)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->begin_query(pipe,
query);
}
static void
identity_end_query(struct pipe_context *_pipe,
struct pipe_query *query)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->end_query(pipe,
query);
}
static boolean
identity_get_query_result(struct pipe_context *_pipe,
struct pipe_query *query,
boolean wait,
uint64_t *result)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->get_query_result(pipe,
query,
wait,
result);
}
static void *
identity_create_blend_state(struct pipe_context *_pipe,
const struct pipe_blend_state *blend)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_blend_state(pipe,
blend);
}
static void
identity_bind_blend_state(struct pipe_context *_pipe,
void *blend)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->bind_blend_state(pipe,
blend);
}
static void
identity_delete_blend_state(struct pipe_context *_pipe,
void *blend)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->delete_blend_state(pipe,
blend);
}
static void *
identity_create_sampler_state(struct pipe_context *_pipe,
const struct pipe_sampler_state *sampler)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_sampler_state(pipe,
sampler);
}
static void
identity_bind_sampler_states(struct pipe_context *_pipe,
unsigned num,
void **samplers)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->bind_sampler_states(pipe,
num,
samplers);
}
static void
identity_delete_sampler_state(struct pipe_context *_pipe,
void *sampler)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->delete_sampler_state(pipe,
sampler);
}
static void *
identity_create_rasterizer_state(struct pipe_context *_pipe,
const struct pipe_rasterizer_state *rasterizer)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_rasterizer_state(pipe,
rasterizer);
}
static void
identity_bind_rasterizer_state(struct pipe_context *_pipe,
void *rasterizer)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->bind_rasterizer_state(pipe,
rasterizer);
}
static void
identity_delete_rasterizer_state(struct pipe_context *_pipe,
void *rasterizer)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->delete_rasterizer_state(pipe,
rasterizer);
}
static void *
identity_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_depth_stencil_alpha_state(pipe,
depth_stencil_alpha);
}
static void
identity_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
void *depth_stencil_alpha)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->bind_depth_stencil_alpha_state(pipe,
depth_stencil_alpha);
}
static void
identity_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
void *depth_stencil_alpha)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->delete_depth_stencil_alpha_state(pipe,
depth_stencil_alpha);
}
static void *
identity_create_fs_state(struct pipe_context *_pipe,
const struct pipe_shader_state *fs)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_fs_state(pipe,
fs);
}
static void
identity_bind_fs_state(struct pipe_context *_pipe,
void *fs)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->bind_fs_state(pipe,
fs);
}
static void
identity_delete_fs_state(struct pipe_context *_pipe,
void *fs)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->delete_fs_state(pipe,
fs);
}
static void *
identity_create_vs_state(struct pipe_context *_pipe,
const struct pipe_shader_state *vs)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
return pipe->create_vs_state(pipe,
vs);
}
static void
identity_bind_vs_state(struct pipe_context *_pipe,
void *vs)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->bind_vs_state(pipe,
vs);
}
static void
identity_delete_vs_state(struct pipe_context *_pipe,
void *vs)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->delete_vs_state(pipe,
vs);
}
static void
identity_set_blend_color(struct pipe_context *_pipe,
const struct pipe_blend_color *blend_color)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_blend_color(pipe,
blend_color);
}
static void
identity_set_clip_state(struct pipe_context *_pipe,
const struct pipe_clip_state *clip)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_clip_state(pipe,
clip);
}
static void
identity_set_constant_buffer(struct pipe_context *_pipe,
uint shader,
uint index,
const struct pipe_constant_buffer *_buffer)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_constant_buffer unwrapped_buffer;
struct pipe_constant_buffer *buffer = NULL;
/* unwrap the input state */
if (_buffer) {
unwrapped_buffer.buffer = identity_buffer_unwrap(_buffer->buffer);
buffer = &unwrapped_buffer;
}
pipe->set_constant_buffer(pipe,
shader,
index,
buffer);
}
static void
identity_set_framebuffer_state(struct pipe_context *_pipe,
const struct pipe_framebuffer_state *_state)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_framebuffer_state unwrapped_state;
struct pipe_framebuffer_state *state = NULL;
unsigned i;
/* unwrap the input state */
if (_state) {
memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));
for(i = 0; i < _state->nr_cbufs; i++)
unwrapped_state.cbufs[i] = identity_surface_unwrap(_state->cbufs[i]);
for (; i < PIPE_MAX_COLOR_BUFS; i++)
unwrapped_state.cbufs[i] = NULL;
unwrapped_state.zsbuf = identity_surface_unwrap(_state->zsbuf);
state = &unwrapped_state;
}
pipe->set_framebuffer_state(pipe,
state);
}
static void
identity_set_polygon_stipple(struct pipe_context *_pipe,
const struct pipe_poly_stipple *poly_stipple)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_polygon_stipple(pipe,
poly_stipple);
}
static void
identity_set_scissor_state(struct pipe_context *_pipe,
const struct pipe_scissor_state *scissor)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_scissor_state(pipe,
scissor);
}
static void
identity_set_viewport_state(struct pipe_context *_pipe,
const struct pipe_viewport_state *viewport)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_viewport_state(pipe,
viewport);
}
static void
identity_set_sampler_textures(struct pipe_context *_pipe,
unsigned num_textures,
struct pipe_texture **_textures)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_texture *unwrapped_textures[PIPE_MAX_SAMPLERS];
struct pipe_texture **textures = NULL;
unsigned i;
if (_textures) {
for (i = 0; i < num_textures; i++)
unwrapped_textures[i] = identity_texture_unwrap(_textures[i]);
for (; i < PIPE_MAX_SAMPLERS; i++)
unwrapped_textures[i] = NULL;
textures = unwrapped_textures;
}
pipe->set_sampler_textures(pipe,
num_textures,
_textures);
}
static void
identity_set_vertex_buffers(struct pipe_context *_pipe,
unsigned num_buffers,
const struct pipe_vertex_buffer *_buffers)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];
struct pipe_vertex_buffer *buffers = NULL;
unsigned i;
if (num_buffers) {
memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));
for (i = 0; i < num_buffers; i++)
unwrapped_buffers[i].buffer = identity_buffer_unwrap(_buffers[i].buffer);
buffers = unwrapped_buffers;
}
pipe->set_vertex_buffers(pipe,
num_buffers,
buffers);
}
static void
identity_set_vertex_elements(struct pipe_context *_pipe,
unsigned num_elements,
const struct pipe_vertex_element *vertex_elements)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->set_vertex_elements(pipe,
num_elements,
vertex_elements);
}
static void
identity_surface_copy(struct pipe_context *_pipe,
struct pipe_surface *_dst,
unsigned dstx,
unsigned dsty,
struct pipe_surface *_src,
unsigned srcx,
unsigned srcy,
unsigned width,
unsigned height)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct identity_surface *id_surface_dst = identity_surface(_dst);
struct identity_surface *id_surface_src = identity_surface(_src);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_surface *dst = id_surface_dst->surface;
struct pipe_surface *src = id_surface_src->surface;
pipe->surface_copy(pipe,
dst,
dstx,
dsty,
src,
srcx,
srcy,
width,
height);
}
static void
identity_surface_fill(struct pipe_context *_pipe,
struct pipe_surface *_dst,
unsigned dstx,
unsigned dsty,
unsigned width,
unsigned height,
unsigned value)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct identity_surface *id_surface_dst = identity_surface(_dst);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_surface *dst = id_surface_dst->surface;
pipe->surface_fill(pipe,
dst,
dstx,
dsty,
width,
height,
value);
}
static void
identity_clear(struct pipe_context *_pipe,
unsigned buffers,
const float *rgba,
double depth,
unsigned stencil)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->clear(pipe,
buffers,
rgba,
depth,
stencil);
}
static void
identity_flush(struct pipe_context *_pipe,
unsigned flags,
struct pipe_fence_handle **fence)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct pipe_context *pipe = id_pipe->pipe;
pipe->flush(pipe,
flags,
fence);
}
static unsigned int
identity_is_texture_referenced(struct pipe_context *_pipe,
struct pipe_texture *_texture,
unsigned face,
unsigned level)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct identity_texture *id_texture = identity_texture(_texture);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_texture *texture = id_texture->texture;
return pipe->is_texture_referenced(pipe,
texture,
face,
level);
}
static unsigned int
identity_is_buffer_referenced(struct pipe_context *_pipe,
struct pipe_buffer *_buffer)
{
struct identity_context *id_pipe = identity_context(_pipe);
struct identity_buffer *id_buffer = identity_buffer(_buffer);
struct pipe_context *pipe = id_pipe->pipe;
struct pipe_buffer *buffer = id_buffer->buffer;
return pipe->is_buffer_referenced(pipe,
buffer);
}
struct pipe_context *
identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
{
struct identity_context *id_pipe;
(void)identity_screen(_screen);
id_pipe = CALLOC_STRUCT(identity_context);
if (!id_pipe) {
return NULL;
}
id_pipe->base.winsys = NULL;
id_pipe->base.screen = _screen;
id_pipe->base.priv = pipe->priv;
id_pipe->base.draw = NULL;
id_pipe->base.destroy = identity_destroy;
id_pipe->base.set_edgeflags = identity_set_edgeflags;
id_pipe->base.draw_arrays = identity_draw_arrays;
id_pipe->base.draw_elements = identity_draw_elements;
id_pipe->base.draw_range_elements = identity_draw_range_elements;
id_pipe->base.create_query = identity_create_query;
id_pipe->base.destroy_query = identity_destroy_query;
id_pipe->base.begin_query = identity_begin_query;
id_pipe->base.end_query = identity_end_query;
id_pipe->base.get_query_result = identity_get_query_result;
id_pipe->base.create_blend_state = identity_create_blend_state;
id_pipe->base.bind_blend_state = identity_bind_blend_state;
id_pipe->base.delete_blend_state = identity_delete_blend_state;
id_pipe->base.create_sampler_state = identity_create_sampler_state;
id_pipe->base.bind_sampler_states = identity_bind_sampler_states;
id_pipe->base.delete_sampler_state = identity_delete_sampler_state;
id_pipe->base.create_rasterizer_state = identity_create_rasterizer_state;
id_pipe->base.bind_rasterizer_state = identity_bind_rasterizer_state;
id_pipe->base.delete_rasterizer_state = identity_delete_rasterizer_state;
id_pipe->base.create_depth_stencil_alpha_state = identity_create_depth_stencil_alpha_state;
id_pipe->base.bind_depth_stencil_alpha_state = identity_bind_depth_stencil_alpha_state;
id_pipe->base.delete_depth_stencil_alpha_state = identity_delete_depth_stencil_alpha_state;
id_pipe->base.create_fs_state = identity_create_fs_state;
id_pipe->base.bind_fs_state = identity_bind_fs_state;
id_pipe->base.delete_fs_state = identity_delete_fs_state;
id_pipe->base.create_vs_state = identity_create_vs_state;
id_pipe->base.bind_vs_state = identity_bind_vs_state;
id_pipe->base.delete_vs_state = identity_delete_vs_state;
id_pipe->base.set_blend_color = identity_set_blend_color;
id_pipe->base.set_clip_state = identity_set_clip_state;
id_pipe->base.set_constant_buffer = identity_set_constant_buffer;
id_pipe->base.set_framebuffer_state = identity_set_framebuffer_state;
id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
id_pipe->base.set_scissor_state = identity_set_scissor_state;
id_pipe->base.set_viewport_state = identity_set_viewport_state;
id_pipe->base.set_sampler_textures = identity_set_sampler_textures;
id_pipe->base.set_vertex_buffers = identity_set_vertex_buffers;
id_pipe->base.set_vertex_elements = identity_set_vertex_elements;
id_pipe->base.surface_copy = identity_surface_copy;
id_pipe->base.surface_fill = identity_surface_fill;
id_pipe->base.clear = identity_clear;
id_pipe->base.flush = identity_flush;
id_pipe->base.is_texture_referenced = identity_is_texture_referenced;
id_pipe->base.is_buffer_referenced = identity_is_buffer_referenced;
id_pipe->pipe = pipe;
return &id_pipe->base;
}

View File

@@ -0,0 +1,48 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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.
*
**************************************************************************/
#ifndef ID_CONTEXT_H
#define ID_CONTEXT_H
#include "pipe/p_state.h"
#include "pipe/p_context.h"
struct identity_context {
struct pipe_context base; /**< base class */
struct pipe_context *pipe;
};
static INLINE struct identity_context *
identity_context(struct pipe_context *pipe)
{
return (struct identity_context *)pipe;
}
#endif /* ID_CONTEXT_H */

View File

@@ -0,0 +1,182 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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 "util/u_memory.h"
#include "id_public.h"
#include "id_screen.h"
#include "id_objects.h"
struct pipe_buffer *
identity_buffer_create(struct identity_screen *id_screen,
struct pipe_buffer *buffer)
{
struct identity_buffer *id_buffer;
if(!buffer)
goto error;
assert(buffer->screen == id_screen->screen);
id_buffer = CALLOC_STRUCT(identity_buffer);
if(!id_buffer)
goto error;
memcpy(&id_buffer->base, buffer, sizeof(struct pipe_buffer));
pipe_reference_init(&id_buffer->base.reference, 1);
id_buffer->base.screen = &id_screen->base;
id_buffer->buffer = buffer;
return &id_buffer->base;
error:
pipe_buffer_reference(&buffer, NULL);
return NULL;
}
void
identity_buffer_destroy(struct identity_buffer *id_buffer)
{
pipe_buffer_reference(&id_buffer->buffer, NULL);
FREE(id_buffer);
}
struct pipe_texture *
identity_texture_create(struct identity_screen *id_screen,
struct pipe_texture *texture)
{
struct identity_texture *id_texture;
if(!texture)
goto error;
assert(texture->screen == id_screen->screen);
id_texture = CALLOC_STRUCT(identity_texture);
if(!id_texture)
goto error;
memcpy(&id_texture->base, texture, sizeof(struct pipe_texture));
pipe_reference_init(&id_texture->base.reference, 1);
id_texture->base.screen = &id_screen->base;
id_texture->texture = texture;
return &id_texture->base;
error:
pipe_texture_reference(&texture, NULL);
return NULL;
}
void
identity_texture_destroy(struct identity_texture *id_texture)
{
pipe_texture_reference(&id_texture->texture, NULL);
FREE(id_texture);
}
struct pipe_surface *
identity_surface_create(struct identity_texture *id_texture,
struct pipe_surface *surface)
{
struct identity_surface *id_surface;
if(!surface)
goto error;
assert(surface->texture == id_texture->texture);
id_surface = CALLOC_STRUCT(identity_surface);
if(!id_surface)
goto error;
memcpy(&id_surface->base, surface, sizeof(struct pipe_surface));
pipe_reference_init(&id_surface->base.reference, 1);
id_surface->base.texture = NULL;
pipe_texture_reference(&id_surface->base.texture, &id_texture->base);
id_surface->surface = surface;
return &id_surface->base;
error:
pipe_surface_reference(&surface, NULL);
return NULL;
}
void
identity_surface_destroy(struct identity_surface *id_surface)
{
pipe_texture_reference(&id_surface->base.texture, NULL);
pipe_surface_reference(&id_surface->surface, NULL);
FREE(id_surface);
}
struct pipe_transfer *
identity_transfer_create(struct identity_texture *id_texture,
struct pipe_transfer *transfer)
{
struct identity_transfer *id_transfer;
if(!transfer)
goto error;
assert(transfer->texture == id_texture->texture);
id_transfer = CALLOC_STRUCT(identity_transfer);
if(!id_transfer)
goto error;
memcpy(&id_transfer->base, transfer, sizeof(struct pipe_transfer));
id_transfer->base.texture = NULL;
pipe_texture_reference(&id_transfer->base.texture, &id_texture->base);
id_transfer->transfer = transfer;
assert(id_transfer->base.texture == &id_texture->base);
return &id_transfer->base;
error:
transfer->texture->screen->tex_transfer_destroy(transfer);
return NULL;
}
void
identity_transfer_destroy(struct identity_transfer *id_transfer)
{
struct identity_screen *id_screen = identity_screen(id_transfer->base.texture->screen);
struct pipe_screen *screen = id_screen->screen;
pipe_texture_reference(&id_transfer->base.texture, NULL);
screen->tex_transfer_destroy(id_transfer->transfer);
FREE(id_transfer);
}

View File

@@ -0,0 +1,169 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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.
*
**************************************************************************/
#ifndef ID_OBJECTS_H
#define ID_OBJECTS_H
#include "pipe/p_compiler.h"
#include "pipe/p_state.h"
#include "id_screen.h"
struct identity_buffer
{
struct pipe_buffer base;
struct pipe_buffer *buffer;
};
struct identity_texture
{
struct pipe_texture base;
struct pipe_texture *texture;
};
struct identity_surface
{
struct pipe_surface base;
struct pipe_surface *surface;
};
struct identity_transfer
{
struct pipe_transfer base;
struct pipe_transfer *transfer;
};
static INLINE struct identity_buffer *
identity_buffer(struct pipe_buffer *_buffer)
{
if(!_buffer)
return NULL;
(void)identity_screen(_buffer->screen);
return (struct identity_buffer *)_buffer;
}
static INLINE struct identity_texture *
identity_texture(struct pipe_texture *_texture)
{
if(!_texture)
return NULL;
(void)identity_screen(_texture->screen);
return (struct identity_texture *)_texture;
}
static INLINE struct identity_surface *
identity_surface(struct pipe_surface *_surface)
{
if(!_surface)
return NULL;
(void)identity_texture(_surface->texture);
return (struct identity_surface *)_surface;
}
static INLINE struct identity_transfer *
identity_transfer(struct pipe_transfer *_transfer)
{
if(!_transfer)
return NULL;
(void)identity_texture(_transfer->texture);
return (struct identity_transfer *)_transfer;
}
static INLINE struct pipe_buffer *
identity_buffer_unwrap(struct pipe_buffer *_buffer)
{
if(!_buffer)
return NULL;
return identity_buffer(_buffer)->buffer;
}
static INLINE struct pipe_texture *
identity_texture_unwrap(struct pipe_texture *_texture)
{
if(!_texture)
return NULL;
return identity_texture(_texture)->texture;
}
static INLINE struct pipe_surface *
identity_surface_unwrap(struct pipe_surface *_surface)
{
if(!_surface)
return NULL;
return identity_surface(_surface)->surface;
}
static INLINE struct pipe_transfer *
identity_transfer_unwrap(struct pipe_transfer *_transfer)
{
if(!_transfer)
return NULL;
return identity_transfer(_transfer)->transfer;
}
struct pipe_buffer *
identity_buffer_create(struct identity_screen *id_screen,
struct pipe_buffer *buffer);
void
identity_buffer_destroy(struct identity_buffer *id_buffer);
struct pipe_texture *
identity_texture_create(struct identity_screen *id_screen,
struct pipe_texture *texture);
void
identity_texture_destroy(struct identity_texture *id_texture);
struct pipe_surface *
identity_surface_create(struct identity_texture *id_texture,
struct pipe_surface *surface);
void
identity_surface_destroy(struct identity_surface *id_surface);
struct pipe_transfer *
identity_transfer_create(struct identity_texture *id_texture,
struct pipe_transfer *transfer);
void
identity_transfer_destroy(struct identity_transfer *id_transfer);
#endif /* ID_OBJECTS_H */

View File

@@ -0,0 +1,40 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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.
*
**************************************************************************/
#ifndef ID_PUBLIC_H
#define ID_PUBLIC_H
struct pipe_screen;
struct pipe_context;
struct pipe_screen *
identity_screen_create(struct pipe_screen *screen);
struct pipe_context *
identity_context_create(struct pipe_screen *screen, struct pipe_context *pipe);
#endif /* PT_PUBLIC_H */

View File

@@ -0,0 +1,481 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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_screen.h"
#include "pipe/p_state.h"
#include "util/u_memory.h"
#include "id_public.h"
#include "id_screen.h"
#include "id_objects.h"
static void
identity_screen_destroy(struct pipe_screen *_screen)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
screen->destroy(screen);
FREE(id_screen);
}
static const char *
identity_screen_get_name(struct pipe_screen *_screen)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->get_name(screen);
}
static const char *
identity_screen_get_vendor(struct pipe_screen *_screen)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->get_vendor(screen);
}
static int
identity_screen_get_param(struct pipe_screen *_screen,
int param)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->get_param(screen,
param);
}
static float
identity_screen_get_paramf(struct pipe_screen *_screen,
int param)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->get_paramf(screen,
param);
}
static boolean
identity_screen_is_format_supported(struct pipe_screen *_screen,
enum pipe_format format,
enum pipe_texture_target target,
unsigned tex_usage,
unsigned geom_flags)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->is_format_supported(screen,
format,
target,
tex_usage,
geom_flags);
}
static struct pipe_texture *
identity_screen_texture_create(struct pipe_screen *_screen,
const struct pipe_texture *templat)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
struct pipe_texture *result;
result = screen->texture_create(screen,
templat);
if (result)
return identity_texture_create(id_screen, result);
return NULL;
}
static struct pipe_texture *
identity_screen_texture_blanket(struct pipe_screen *_screen,
const struct pipe_texture *templat,
const unsigned *stride,
struct pipe_buffer *_buffer)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_buffer *id_buffer = identity_buffer(_buffer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *buffer = id_buffer->buffer;
struct pipe_texture *result;
result = screen->texture_blanket(screen,
templat,
stride,
buffer);
if (result)
return identity_texture_create(id_screen, result);
return NULL;
}
static void
identity_screen_texture_destroy(struct pipe_texture *_texture)
{
identity_texture_destroy(identity_texture(_texture));
}
static struct pipe_surface *
identity_screen_get_tex_surface(struct pipe_screen *_screen,
struct pipe_texture *_texture,
unsigned face,
unsigned level,
unsigned zslice,
unsigned usage)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_texture *id_texture = identity_texture(_texture);
struct pipe_screen *screen = id_screen->screen;
struct pipe_texture *texture = id_texture->texture;
struct pipe_surface *result;
result = screen->get_tex_surface(screen,
texture,
face,
level,
zslice,
usage);
if (result)
return identity_surface_create(id_texture, result);
return NULL;
}
static void
identity_screen_tex_surface_destroy(struct pipe_surface *_surface)
{
identity_surface_destroy(identity_surface(_surface));
}
static struct pipe_transfer *
identity_screen_get_tex_transfer(struct pipe_screen *_screen,
struct pipe_texture *_texture,
unsigned face,
unsigned level,
unsigned zslice,
enum pipe_transfer_usage usage,
unsigned x,
unsigned y,
unsigned w,
unsigned h)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_texture *id_texture = identity_texture(_texture);
struct pipe_screen *screen = id_screen->screen;
struct pipe_texture *texture = id_texture->texture;
struct pipe_transfer *result;
result = screen->get_tex_transfer(screen,
texture,
face,
level,
zslice,
usage,
x,
y,
w,
h);
if (result)
return identity_transfer_create(id_texture, result);
return NULL;
}
static void
identity_screen_tex_transfer_destroy(struct pipe_transfer *_transfer)
{
identity_transfer_destroy(identity_transfer(_transfer));
}
static void *
identity_screen_transfer_map(struct pipe_screen *_screen,
struct pipe_transfer *_transfer)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_transfer *id_transfer = identity_transfer(_transfer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_transfer *transfer = id_transfer->transfer;
return screen->transfer_map(screen,
transfer);
}
static void
identity_screen_transfer_unmap(struct pipe_screen *_screen,
struct pipe_transfer *_transfer)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_transfer *id_transfer = identity_transfer(_transfer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_transfer *transfer = id_transfer->transfer;
screen->transfer_unmap(screen,
transfer);
}
static struct pipe_buffer *
identity_screen_buffer_create(struct pipe_screen *_screen,
unsigned alignment,
unsigned usage,
unsigned size)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *result;
result = screen->buffer_create(screen,
alignment,
usage,
size);
if (result)
return identity_buffer_create(id_screen, result);
return NULL;
}
static struct pipe_buffer *
identity_screen_user_buffer_create(struct pipe_screen *_screen,
void *ptr,
unsigned bytes)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *result;
result = screen->user_buffer_create(screen,
ptr,
bytes);
if (result)
return identity_buffer_create(id_screen, result);
return NULL;
}
static struct pipe_buffer *
identity_screen_surface_buffer_create(struct pipe_screen *_screen,
unsigned width,
unsigned height,
enum pipe_format format,
unsigned usage,
unsigned *stride)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *result;
result = screen->surface_buffer_create(screen,
width,
height,
format,
usage,
stride);
if (result)
return identity_buffer_create(id_screen, result);
return NULL;
}
static void *
identity_screen_buffer_map(struct pipe_screen *_screen,
struct pipe_buffer *_buffer,
unsigned usage)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_buffer *id_buffer = identity_buffer(_buffer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *buffer = id_buffer->buffer;
return screen->buffer_map(screen,
buffer,
usage);
}
static void *
identity_screen_buffer_map_range(struct pipe_screen *_screen,
struct pipe_buffer *_buffer,
unsigned offset,
unsigned length,
unsigned usage)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_buffer *id_buffer = identity_buffer(_buffer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *buffer = id_buffer->buffer;
return screen->buffer_map_range(screen,
buffer,
offset,
length,
usage);
}
static void
identity_screen_buffer_flush_mapped_range(struct pipe_screen *_screen,
struct pipe_buffer *_buffer,
unsigned offset,
unsigned length)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_buffer *id_buffer = identity_buffer(_buffer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *buffer = id_buffer->buffer;
screen->buffer_flush_mapped_range(screen,
buffer,
offset,
length);
}
static void
identity_screen_buffer_unmap(struct pipe_screen *_screen,
struct pipe_buffer *_buffer)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_buffer *id_buffer = identity_buffer(_buffer);
struct pipe_screen *screen = id_screen->screen;
struct pipe_buffer *buffer = id_buffer->buffer;
screen->buffer_unmap(screen,
buffer);
}
static void
identity_screen_buffer_destroy(struct pipe_buffer *_buffer)
{
identity_buffer_destroy(identity_buffer(_buffer));
}
static void
identity_screen_flush_frontbuffer(struct pipe_screen *_screen,
struct pipe_surface *_surface,
void *context_private)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct identity_surface *id_surface = identity_surface(_surface);
struct pipe_screen *screen = id_screen->screen;
struct pipe_surface *surface = id_surface->surface;
screen->flush_frontbuffer(screen,
surface,
context_private);
}
static void
identity_screen_fence_reference(struct pipe_screen *_screen,
struct pipe_fence_handle **ptr,
struct pipe_fence_handle *fence)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
screen->fence_reference(screen,
ptr,
fence);
}
static int
identity_screen_fence_signalled(struct pipe_screen *_screen,
struct pipe_fence_handle *fence,
unsigned flags)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->fence_signalled(screen,
fence,
flags);
}
static int
identity_screen_fence_finish(struct pipe_screen *_screen,
struct pipe_fence_handle *fence,
unsigned flags)
{
struct identity_screen *id_screen = identity_screen(_screen);
struct pipe_screen *screen = id_screen->screen;
return screen->fence_finish(screen,
fence,
flags);
}
struct pipe_screen *
identity_screen_create(struct pipe_screen *screen)
{
struct identity_screen *id_screen;
id_screen = CALLOC_STRUCT(identity_screen);
if (!id_screen) {
return NULL;
}
id_screen->base.winsys = NULL;
id_screen->base.destroy = identity_screen_destroy;
id_screen->base.get_name = identity_screen_get_name;
id_screen->base.get_vendor = identity_screen_get_vendor;
id_screen->base.get_param = identity_screen_get_param;
id_screen->base.get_paramf = identity_screen_get_paramf;
id_screen->base.is_format_supported = identity_screen_is_format_supported;
id_screen->base.texture_create = identity_screen_texture_create;
id_screen->base.texture_blanket = identity_screen_texture_blanket;
id_screen->base.texture_destroy = identity_screen_texture_destroy;
id_screen->base.get_tex_surface = identity_screen_get_tex_surface;
id_screen->base.tex_surface_destroy = identity_screen_tex_surface_destroy;
id_screen->base.get_tex_transfer = identity_screen_get_tex_transfer;
id_screen->base.tex_transfer_destroy = identity_screen_tex_transfer_destroy;
id_screen->base.transfer_map = identity_screen_transfer_map;
id_screen->base.transfer_unmap = identity_screen_transfer_unmap;
id_screen->base.buffer_create = identity_screen_buffer_create;
id_screen->base.user_buffer_create = identity_screen_user_buffer_create;
id_screen->base.surface_buffer_create = identity_screen_surface_buffer_create;
if (screen->buffer_map)
id_screen->base.buffer_map = identity_screen_buffer_map;
if (screen->buffer_map_range)
id_screen->base.buffer_map_range = identity_screen_buffer_map_range;
if (screen->buffer_flush_mapped_range)
id_screen->base.buffer_flush_mapped_range = identity_screen_buffer_flush_mapped_range;
if (screen->buffer_unmap)
id_screen->base.buffer_unmap = identity_screen_buffer_unmap;
id_screen->base.buffer_destroy = identity_screen_buffer_destroy;
id_screen->base.flush_frontbuffer = identity_screen_flush_frontbuffer;
id_screen->base.fence_reference = identity_screen_fence_reference;
id_screen->base.fence_signalled = identity_screen_fence_signalled;
id_screen->base.fence_finish = identity_screen_fence_finish;
id_screen->screen = screen;
return &id_screen->base;
}

View File

@@ -0,0 +1,48 @@
/**************************************************************************
*
* Copyright 2009 VMware, Inc.
* All Rights Reserved.
*
* 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.
*
**************************************************************************/
#ifndef ID_SCREEN_H
#define ID_SCREEN_H
#include "pipe/p_screen.h"
#include "pipe/p_defines.h"
struct identity_screen {
struct pipe_screen base;
struct pipe_screen *screen;
};
static INLINE struct identity_screen *
identity_screen(struct pipe_screen *screen)
{
return (struct identity_screen *)screen;
}
#endif /* ID_SCREEN_H */