diff options
Diffstat (limited to 'src/gallium/winsys/drm/vmware')
31 files changed, 0 insertions, 5288 deletions
diff --git a/src/gallium/winsys/drm/vmware/Makefile b/src/gallium/winsys/drm/vmware/Makefile deleted file mode 100644 index 2ae6dead5c..0000000000 --- a/src/gallium/winsys/drm/vmware/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# src/gallium/winsys/drm/vmware/Makefile -TOP = ../../../../.. -include $(TOP)/configs/current - -SUBDIRS = core $(GALLIUM_STATE_TRACKERS_DIRS) - -default install clean: - @for dir in $(SUBDIRS) ; do \ - if [ -d $$dir ] ; then \ - (cd $$dir && $(MAKE) $@) || exit 1; \ - fi \ - done diff --git a/src/gallium/winsys/drm/vmware/SConscript b/src/gallium/winsys/drm/vmware/SConscript deleted file mode 100644 index 06e6d5be9c..0000000000 --- a/src/gallium/winsys/drm/vmware/SConscript +++ /dev/null @@ -1,11 +0,0 @@ -Import('*') - -SConscript(['core/SConscript',]) - -if 'mesa' in env['statetrackers']: - - SConscript(['dri/SConscript']) - -if 'xorg' in env['statetrackers']: - - SConscript(['xorg/SConscript']) diff --git a/src/gallium/winsys/drm/vmware/core/Makefile b/src/gallium/winsys/drm/vmware/core/Makefile deleted file mode 100644 index a52957c1a5..0000000000 --- a/src/gallium/winsys/drm/vmware/core/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -TOP = ../../../../../.. -include $(TOP)/configs/current - -LIBNAME = svgadrm - -C_SOURCES = \ - vmw_buffer.c \ - vmw_context.c \ - vmw_fence.c \ - vmw_screen.c \ - vmw_screen_dri.c \ - vmw_screen_ioctl.c \ - vmw_screen_pools.c \ - vmw_screen_svga.c \ - vmw_surface.c - -LIBRARY_INCLUDES = \ - -I$(TOP)/src/gallium/drivers/svga \ - -I$(TOP)/src/gallium/drivers/svga/include \ - -I$(GALLIUM)/src/mesa/drivers/dri/common \ - -I$(GALLIUM)/include \ - -I$(GALLIUM)/include/GL/internal \ - -I$(GALLIUM)/src/mesa \ - -I$(GALLIUM)/src/mesa/main \ - -I$(GALLIUM)/src/mesa/glapi \ - -I$(GALLIUM)/src/egl/main \ - -I$(GALLIUM)/src/egl/drivers/dri \ - $(shell pkg-config libdrm --cflags-only-I) - -LIBRARY_DEFINES = \ - -std=gnu99 -fvisibility=hidden \ - -DHAVE_STDINT_H -D_FILE_OFFSET_BITS=64 \ - $(shell pkg-config libdrm --cflags-only-other) - -include ../../../../Makefile.template diff --git a/src/gallium/winsys/drm/vmware/core/SConscript b/src/gallium/winsys/drm/vmware/core/SConscript deleted file mode 100644 index edaf9458be..0000000000 --- a/src/gallium/winsys/drm/vmware/core/SConscript +++ /dev/null @@ -1,39 +0,0 @@ -Import('*') - -env = env.Clone() - -if env['gcc']: - env.Append(CCFLAGS = ['-fvisibility=hidden']) - env.Append(CPPDEFINES = [ - 'HAVE_STDINT_H', - 'HAVE_SYS_TYPES_H', - '-D_FILE_OFFSET_BITS=64', - ]) - -env.Prepend(CPPPATH = [ - 'include', - '#/src/gallium/drivers/svga', - '#/src/gallium/drivers/svga/include', -]) - -env.Append(CPPDEFINES = [ -]) - -sources = [ - 'vmw_buffer.c', - 'vmw_context.c', - 'vmw_fence.c', - 'vmw_screen.c', - 'vmw_screen_dri.c', - 'vmw_screen_ioctl.c', - 'vmw_screen_pools.c', - 'vmw_screen_svga.c', - 'vmw_surface.c', -] - -svgadrm = env.ConvenienceLibrary( - target = 'svgadrm', - source = sources, -) - -Export('svgadrm') diff --git a/src/gallium/winsys/drm/vmware/core/vmw_buffer.c b/src/gallium/winsys/drm/vmware/core/vmw_buffer.c deleted file mode 100644 index eca174a6c5..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_buffer.c +++ /dev/null @@ -1,274 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * SVGA buffer manager for Guest Memory Regions (GMRs). - * - * GMRs are used for pixel and vertex data upload/download to/from the virtual - * SVGA hardware. There is a limited number of GMRs available, and - * creating/destroying them is also a slow operation so we must suballocate - * them. - * - * This file implements a pipebuffer library's buffer manager, so that we can - * use pipepbuffer's suballocation, fencing, and debugging facilities with GMRs. - * - * @author Jose Fonseca <jfonseca@vmware.com> - */ - - -#include "svga_cmd.h" - -#include "util/u_inlines.h" -#include "util/u_memory.h" -#include "pipebuffer/pb_buffer.h" -#include "pipebuffer/pb_bufmgr.h" - -#include "svga_winsys.h" - -#include "vmw_screen.h" -#include "vmw_buffer.h" - - -struct vmw_gmr_bufmgr; - - -struct vmw_gmr_buffer -{ - struct pb_buffer base; - - struct vmw_gmr_bufmgr *mgr; - - struct vmw_region *region; - void *map; - -#ifdef DEBUG - struct pipe_fence_handle *last_fence; -#endif -}; - - -extern const struct pb_vtbl vmw_gmr_buffer_vtbl; - - -static INLINE struct vmw_gmr_buffer * -vmw_gmr_buffer(struct pb_buffer *buf) -{ - assert(buf); - assert(buf->vtbl == &vmw_gmr_buffer_vtbl); - return (struct vmw_gmr_buffer *)buf; -} - - -struct vmw_gmr_bufmgr -{ - struct pb_manager base; - - struct vmw_winsys_screen *vws; -}; - - -static INLINE struct vmw_gmr_bufmgr * -vmw_gmr_bufmgr(struct pb_manager *mgr) -{ - assert(mgr); - return (struct vmw_gmr_bufmgr *)mgr; -} - - -static void -vmw_gmr_buffer_destroy(struct pb_buffer *_buf) -{ - struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf); - -#ifdef DEBUG - if(buf->last_fence) { - struct svga_winsys_screen *sws = &buf->mgr->vws->base; - assert(sws->fence_signalled(sws, buf->last_fence, 0) == 0); - } -#endif - - vmw_ioctl_region_unmap(buf->region); - - vmw_ioctl_region_destroy(buf->region); - - FREE(buf); -} - - -static void * -vmw_gmr_buffer_map(struct pb_buffer *_buf, - unsigned flags) -{ - struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf); - return buf->map; -} - - -static void -vmw_gmr_buffer_unmap(struct pb_buffer *_buf) -{ - /* Do nothing */ - (void)_buf; -} - - -static void -vmw_gmr_buffer_get_base_buffer(struct pb_buffer *buf, - struct pb_buffer **base_buf, - unsigned *offset) -{ - *base_buf = buf; - *offset = 0; -} - - -static enum pipe_error -vmw_gmr_buffer_validate( struct pb_buffer *_buf, - struct pb_validate *vl, - unsigned flags ) -{ - /* Always pinned */ - return PIPE_OK; -} - - -static void -vmw_gmr_buffer_fence( struct pb_buffer *_buf, - struct pipe_fence_handle *fence ) -{ - /* We don't need to do anything, as the pipebuffer library - * will take care of delaying the destruction of fenced buffers */ -#ifdef DEBUG - struct vmw_gmr_buffer *buf = vmw_gmr_buffer(_buf); - if(fence) - buf->last_fence = fence; -#endif -} - - -const struct pb_vtbl vmw_gmr_buffer_vtbl = { - vmw_gmr_buffer_destroy, - vmw_gmr_buffer_map, - vmw_gmr_buffer_unmap, - vmw_gmr_buffer_validate, - vmw_gmr_buffer_fence, - vmw_gmr_buffer_get_base_buffer -}; - - -static struct pb_buffer * -vmw_gmr_bufmgr_create_buffer(struct pb_manager *_mgr, - pb_size size, - const struct pb_desc *desc) -{ - struct vmw_gmr_bufmgr *mgr = vmw_gmr_bufmgr(_mgr); - struct vmw_winsys_screen *vws = mgr->vws; - struct vmw_gmr_buffer *buf; - - buf = CALLOC_STRUCT(vmw_gmr_buffer); - if(!buf) - goto error1; - - pipe_reference_init(&buf->base.base.reference, 1); - buf->base.base.alignment = desc->alignment; - buf->base.base.usage = desc->usage; - buf->base.base.size = size; - buf->base.vtbl = &vmw_gmr_buffer_vtbl; - buf->mgr = mgr; - - buf->region = vmw_ioctl_region_create(vws, size); - if(!buf->region) - goto error2; - - buf->map = vmw_ioctl_region_map(buf->region); - if(!buf->map) - goto error3; - - return &buf->base; - -error3: - vmw_ioctl_region_destroy(buf->region); -error2: - FREE(buf); -error1: - return NULL; -} - - -static void -vmw_gmr_bufmgr_flush(struct pb_manager *mgr) -{ - /* No-op */ -} - - -static void -vmw_gmr_bufmgr_destroy(struct pb_manager *_mgr) -{ - struct vmw_gmr_bufmgr *mgr = vmw_gmr_bufmgr(_mgr); - FREE(mgr); -} - - -struct pb_manager * -vmw_gmr_bufmgr_create(struct vmw_winsys_screen *vws) -{ - struct vmw_gmr_bufmgr *mgr; - - mgr = CALLOC_STRUCT(vmw_gmr_bufmgr); - if(!mgr) - return NULL; - - mgr->base.destroy = vmw_gmr_bufmgr_destroy; - mgr->base.create_buffer = vmw_gmr_bufmgr_create_buffer; - mgr->base.flush = vmw_gmr_bufmgr_flush; - - mgr->vws = vws; - - return &mgr->base; -} - - -boolean -vmw_gmr_bufmgr_region_ptr(struct pb_buffer *buf, - struct SVGAGuestPtr *ptr) -{ - struct pb_buffer *base_buf; - unsigned offset = 0; - struct vmw_gmr_buffer *gmr_buf; - - pb_get_base_buffer( buf, &base_buf, &offset ); - - gmr_buf = vmw_gmr_buffer(base_buf); - if(!gmr_buf) - return FALSE; - - *ptr = vmw_ioctl_region_ptr(gmr_buf->region); - - ptr->offset += offset; - - return TRUE; -} diff --git a/src/gallium/winsys/drm/vmware/core/vmw_buffer.h b/src/gallium/winsys/drm/vmware/core/vmw_buffer.h deleted file mode 100644 index 41fb4476da..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_buffer.h +++ /dev/null @@ -1,65 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 VMW_BUFFER_H_ -#define VMW_BUFFER_H_ - -#include <assert.h> -#include "pipe/p_compiler.h" - -struct SVGAGuestPtr; -struct pb_buffer; -struct pb_manager; -struct svga_winsys_buffer; -struct svga_winsys_surface; -struct vmw_winsys_screen; - - -static INLINE struct pb_buffer * -vmw_pb_buffer(struct svga_winsys_buffer *buffer) -{ - assert(buffer); - return (struct pb_buffer *)buffer; -} - - -static INLINE struct svga_winsys_buffer * -vmw_svga_winsys_buffer(struct pb_buffer *buffer) -{ - assert(buffer); - return (struct svga_winsys_buffer *)buffer; -} - - -struct pb_manager * -vmw_gmr_bufmgr_create(struct vmw_winsys_screen *vws); - -boolean -vmw_gmr_bufmgr_region_ptr(struct pb_buffer *buf, - struct SVGAGuestPtr *ptr); - - -#endif /* VMW_BUFFER_H_ */ diff --git a/src/gallium/winsys/drm/vmware/core/vmw_context.c b/src/gallium/winsys/drm/vmware/core/vmw_context.c deleted file mode 100644 index 90ffc4868f..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_context.c +++ /dev/null @@ -1,382 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 "svga_cmd.h" - -#include "util/u_debug.h" -#include "util/u_memory.h" -#include "util/u_debug_stack.h" -#include "pipebuffer/pb_buffer.h" -#include "pipebuffer/pb_validate.h" - -#include "svga_winsys.h" -#include "vmw_context.h" -#include "vmw_screen.h" -#include "vmw_buffer.h" -#include "vmw_surface.h" -#include "vmw_fence.h" - -#define VMW_COMMAND_SIZE (64*1024) -#define VMW_SURFACE_RELOCS (1024) -#define VMW_REGION_RELOCS (512) - -#define VMW_MUST_FLUSH_STACK 8 - -struct vmw_region_relocation -{ - struct SVGAGuestPtr *where; - struct pb_buffer *buffer; - /* TODO: put offset info inside where */ - uint32 offset; -}; - -struct vmw_svga_winsys_context -{ - struct svga_winsys_context base; - - struct vmw_winsys_screen *vws; - -#ifdef DEBUG - boolean must_flush; - struct debug_stack_frame must_flush_stack[VMW_MUST_FLUSH_STACK]; -#endif - - struct { - uint8_t buffer[VMW_COMMAND_SIZE]; - uint32_t size; - uint32_t used; - uint32_t reserved; - } command; - - struct { - struct vmw_svga_winsys_surface *handles[VMW_SURFACE_RELOCS]; - uint32_t size; - uint32_t used; - uint32_t staged; - uint32_t reserved; - } surface; - - struct { - struct vmw_region_relocation relocs[VMW_REGION_RELOCS]; - uint32_t size; - uint32_t used; - uint32_t staged; - uint32_t reserved; - } region; - - struct pb_validate *validate; - - uint32_t last_fence; - - /** - * The amount of GMR that is referred by the commands currently batched - * in the context. - */ - uint32_t seen_regions; - - /** - * Whether this context should fail to reserve more commands, not because it - * ran out of command space, but because a substantial ammount of GMR was - * referred. - */ - boolean preemptive_flush; -}; - - -static INLINE struct vmw_svga_winsys_context * -vmw_svga_winsys_context(struct svga_winsys_context *swc) -{ - assert(swc); - return (struct vmw_svga_winsys_context *)swc; -} - - -static enum pipe_error -vmw_swc_flush(struct svga_winsys_context *swc, - struct pipe_fence_handle **pfence) -{ - struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); - struct pipe_fence_handle *fence = NULL; - unsigned i; - enum pipe_error ret; - - ret = pb_validate_validate(vswc->validate); - assert(ret == PIPE_OK); - if(ret == PIPE_OK) { - - /* Apply relocations */ - for(i = 0; i < vswc->region.used; ++i) { - struct vmw_region_relocation *reloc = &vswc->region.relocs[i]; - struct SVGAGuestPtr ptr; - - if(!vmw_gmr_bufmgr_region_ptr(reloc->buffer, &ptr)) - assert(0); - - ptr.offset += reloc->offset; - - *reloc->where = ptr; - } - - if (vswc->command.used) - vmw_ioctl_command(vswc->vws, - vswc->command.buffer, - vswc->command.used, - &vswc->last_fence); - - fence = vmw_pipe_fence(vswc->last_fence); - - pb_validate_fence(vswc->validate, fence); - } - - vswc->command.used = 0; - vswc->command.reserved = 0; - - for(i = 0; i < vswc->surface.used + vswc->surface.staged; ++i) { - struct vmw_svga_winsys_surface *vsurf = - vswc->surface.handles[i]; - p_atomic_dec(&vsurf->validated); - vmw_svga_winsys_surface_reference(&vswc->surface.handles[i], NULL); - } - - vswc->surface.used = 0; - vswc->surface.reserved = 0; - - for(i = 0; i < vswc->region.used + vswc->region.staged; ++i) { - pb_reference(&vswc->region.relocs[i].buffer, NULL); - } - - vswc->region.used = 0; - vswc->region.reserved = 0; - -#ifdef DEBUG - vswc->must_flush = FALSE; -#endif - vswc->preemptive_flush = FALSE; - vswc->seen_regions = 0; - - if(pfence) - *pfence = fence; - - return ret; -} - - -static void * -vmw_swc_reserve(struct svga_winsys_context *swc, - uint32_t nr_bytes, uint32_t nr_relocs ) -{ - struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); - -#ifdef DEBUG - /* Check if somebody forgot to check the previous failure */ - if(vswc->must_flush) { - debug_printf("Forgot to flush:\n"); - debug_backtrace_dump(vswc->must_flush_stack, VMW_MUST_FLUSH_STACK); - assert(!vswc->must_flush); - } -#endif - - assert(nr_bytes <= vswc->command.size); - if(nr_bytes > vswc->command.size) - return NULL; - - if(vswc->preemptive_flush || - vswc->command.used + nr_bytes > vswc->command.size || - vswc->surface.used + nr_relocs > vswc->surface.size || - vswc->region.used + nr_relocs > vswc->region.size) { -#ifdef DEBUG - vswc->must_flush = TRUE; - debug_backtrace_capture(vswc->must_flush_stack, 1, - VMW_MUST_FLUSH_STACK); -#endif - return NULL; - } - - assert(vswc->command.used + nr_bytes <= vswc->command.size); - assert(vswc->surface.used + nr_relocs <= vswc->surface.size); - assert(vswc->region.used + nr_relocs <= vswc->region.size); - - vswc->command.reserved = nr_bytes; - vswc->surface.reserved = nr_relocs; - vswc->surface.staged = 0; - vswc->region.reserved = nr_relocs; - vswc->region.staged = 0; - - return vswc->command.buffer + vswc->command.used; -} - - -static void -vmw_swc_surface_relocation(struct svga_winsys_context *swc, - uint32 *where, - struct svga_winsys_surface *surface, - unsigned flags) -{ - struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); - struct vmw_svga_winsys_surface *vsurf; - - if(!surface) { - *where = SVGA3D_INVALID_ID; - return; - } - - assert(vswc->surface.staged < vswc->surface.reserved); - - vsurf = vmw_svga_winsys_surface(surface); - - *where = vsurf->sid; - - vmw_svga_winsys_surface_reference(&vswc->surface.handles[vswc->surface.used + vswc->surface.staged], vsurf); - p_atomic_inc(&vsurf->validated); - ++vswc->surface.staged; -} - - -static void -vmw_swc_region_relocation(struct svga_winsys_context *swc, - struct SVGAGuestPtr *where, - struct svga_winsys_buffer *buffer, - uint32 offset, - unsigned flags) -{ - struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); - struct vmw_region_relocation *reloc; - enum pipe_error ret; - - assert(vswc->region.staged < vswc->region.reserved); - - reloc = &vswc->region.relocs[vswc->region.used + vswc->region.staged]; - reloc->where = where; - pb_reference(&reloc->buffer, vmw_pb_buffer(buffer)); - reloc->offset = offset; - - ++vswc->region.staged; - - ret = pb_validate_add_buffer(vswc->validate, reloc->buffer, flags); - /* TODO: Update pipebuffer to reserve buffers and not fail here */ - assert(ret == PIPE_OK); - - /* - * Flush preemptively the FIFO commands to keep the GMR working set within - * the GMR pool size. - * - * This is necessary for applications like SPECviewperf that generate huge - * amounts of immediate vertex data, so that we don't pile up too much of - * that vertex data neither in the guest nor in the host. - * - * Note that in the current implementation if a region is referred twice in - * a command stream, it will be accounted twice. We could detect repeated - * regions and count only once, but there is no incentive to do that, since - * regions are typically short-lived; always referred in a single command; - * and at the worst we just flush the commands a bit sooner, which for the - * SVGA virtual device it's not a performance issue since flushing commands - * to the FIFO won't cause flushing in the host. - */ - vswc->seen_regions += reloc->buffer->base.size; - if(vswc->seen_regions >= VMW_GMR_POOL_SIZE/2) - vswc->preemptive_flush = TRUE; -} - - -static void -vmw_swc_commit(struct svga_winsys_context *swc) -{ - struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); - - assert(vswc->command.reserved); - assert(vswc->command.used + vswc->command.reserved <= vswc->command.size); - vswc->command.used += vswc->command.reserved; - vswc->command.reserved = 0; - - assert(vswc->surface.staged <= vswc->surface.reserved); - assert(vswc->surface.used + vswc->surface.staged <= vswc->surface.size); - vswc->surface.used += vswc->surface.staged; - vswc->surface.staged = 0; - vswc->surface.reserved = 0; - - assert(vswc->region.staged <= vswc->region.reserved); - assert(vswc->region.used + vswc->region.staged <= vswc->region.size); - vswc->region.used += vswc->region.staged; - vswc->region.staged = 0; - vswc->region.reserved = 0; -} - - -static void -vmw_swc_destroy(struct svga_winsys_context *swc) -{ - struct vmw_svga_winsys_context *vswc = vmw_svga_winsys_context(swc); - unsigned i; - - for(i = 0; i < vswc->region.used; ++i) { - pb_reference(&vswc->region.relocs[i].buffer, NULL); - } - - for(i = 0; i < vswc->surface.used; ++i) { - p_atomic_dec(&vswc->surface.handles[i]->validated); - vmw_svga_winsys_surface_reference(&vswc->surface.handles[i], NULL); - } - pb_validate_destroy(vswc->validate); - vmw_ioctl_context_destroy(vswc->vws, swc->cid); - FREE(vswc); -} - - -struct svga_winsys_context * -vmw_svga_winsys_context_create(struct svga_winsys_screen *sws) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - struct vmw_svga_winsys_context *vswc; - - vswc = CALLOC_STRUCT(vmw_svga_winsys_context); - if(!vswc) - return NULL; - - vswc->base.destroy = vmw_swc_destroy; - vswc->base.reserve = vmw_swc_reserve; - vswc->base.surface_relocation = vmw_swc_surface_relocation; - vswc->base.region_relocation = vmw_swc_region_relocation; - vswc->base.commit = vmw_swc_commit; - vswc->base.flush = vmw_swc_flush; - - vswc->base.cid = vmw_ioctl_context_create(vws); - - vswc->vws = vws; - - vswc->command.size = VMW_COMMAND_SIZE; - vswc->surface.size = VMW_SURFACE_RELOCS; - vswc->region.size = VMW_REGION_RELOCS; - - vswc->validate = pb_validate_create(); - if(!vswc->validate) { - FREE(vswc); - return NULL; - } - - return &vswc->base; -} - - diff --git a/src/gallium/winsys/drm/vmware/core/vmw_context.h b/src/gallium/winsys/drm/vmware/core/vmw_context.h deleted file mode 100644 index d4884d24e9..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_context.h +++ /dev/null @@ -1,56 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @author Jose Fonseca <jfonseca@vmware.com> - */ - - -#ifndef VMW_CONTEXT_H_ -#define VMW_CONTEXT_H_ - -#include "pipe/p_compiler.h" - -struct svga_winsys_screen; -struct svga_winsys_context; -struct pipe_context; -struct pipe_screen; - -#define VMW_DEBUG 0 - -#if VMW_DEBUG -#define vmw_printf debug_printf -#define VMW_FUNC debug_printf("%s\n", __FUNCTION__) -#else -#define VMW_FUNC -#define vmw_printf(...) -#endif - - -struct svga_winsys_context * -vmw_svga_winsys_context_create(struct svga_winsys_screen *sws); - - -#endif /* VMW_CONTEXT_H_ */ diff --git a/src/gallium/winsys/drm/vmware/core/vmw_fence.c b/src/gallium/winsys/drm/vmware/core/vmw_fence.c deleted file mode 100644 index 873dd51166..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_fence.c +++ /dev/null @@ -1,108 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 "pipebuffer/pb_buffer_fenced.h" - -#include "vmw_screen.h" -#include "vmw_fence.h" - - - -struct vmw_fence_ops -{ - struct pb_fence_ops base; - - struct vmw_winsys_screen *vws; -}; - - -static INLINE struct vmw_fence_ops * -vmw_fence_ops(struct pb_fence_ops *ops) -{ - assert(ops); - return (struct vmw_fence_ops *)ops; -} - - -static void -vmw_fence_ops_fence_reference(struct pb_fence_ops *ops, - struct pipe_fence_handle **ptr, - struct pipe_fence_handle *fence) -{ - *ptr = fence; -} - - -static int -vmw_fence_ops_fence_signalled(struct pb_fence_ops *ops, - struct pipe_fence_handle *fence, - unsigned flag) -{ - struct vmw_winsys_screen *vws = vmw_fence_ops(ops)->vws; - (void)flag; - return vmw_ioctl_fence_signalled(vws, vmw_fence(fence)); -} - - -static int -vmw_fence_ops_fence_finish(struct pb_fence_ops *ops, - struct pipe_fence_handle *fence, - unsigned flag) -{ - struct vmw_winsys_screen *vws = vmw_fence_ops(ops)->vws; - (void)flag; - return vmw_ioctl_fence_finish(vws, vmw_fence(fence)); -} - - -static void -vmw_fence_ops_destroy(struct pb_fence_ops *ops) -{ - FREE(ops); -} - - -struct pb_fence_ops * -vmw_fence_ops_create(struct vmw_winsys_screen *vws) -{ - struct vmw_fence_ops *ops; - - ops = CALLOC_STRUCT(vmw_fence_ops); - if(!ops) - return NULL; - - ops->base.destroy = &vmw_fence_ops_destroy; - ops->base.fence_reference = &vmw_fence_ops_fence_reference; - ops->base.fence_signalled = &vmw_fence_ops_fence_signalled; - ops->base.fence_finish = &vmw_fence_ops_fence_finish; - - ops->vws = vws; - - return &ops->base; -} - - diff --git a/src/gallium/winsys/drm/vmware/core/vmw_fence.h b/src/gallium/winsys/drm/vmware/core/vmw_fence.h deleted file mode 100644 index 5357b4f61d..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_fence.h +++ /dev/null @@ -1,59 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 VMW_FENCE_H_ -#define VMW_FENCE_H_ - - -#include "pipe/p_compiler.h" - - -struct pipe_fence_handle; -struct pb_fence_ops; -struct vmw_winsys_screen; - - -/** Cast from a pipe_fence_handle pointer into a SVGA fence */ -static INLINE uint32_t -vmw_fence( struct pipe_fence_handle *fence ) -{ - return (uint32_t)(uintptr_t)fence; -} - - -/** Cast from a SVGA fence number to pipe_fence_handle pointer */ -static INLINE struct pipe_fence_handle * -vmw_pipe_fence( uint32_t fence ) -{ - return (struct pipe_fence_handle *)(uintptr_t)fence; -} - - -struct pb_fence_ops * -vmw_fence_ops_create(struct vmw_winsys_screen *vws); - - -#endif /* VMW_FENCE_H_ */ diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen.c b/src/gallium/winsys/drm/vmware/core/vmw_screen.c deleted file mode 100644 index 6cc9b38293..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen.c +++ /dev/null @@ -1,77 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 "vmw_screen.h" - -#include "vmw_context.h" - -#include "util/u_memory.h" -#include "pipe/p_compiler.h" - - -/* Called from vmw_drm_create_screen(), creates and initializes the - * vmw_winsys_screen structure, which is the main entity in this - * module. - */ -struct vmw_winsys_screen * -vmw_winsys_create( int fd, boolean use_old_scanout_flag ) -{ - struct vmw_winsys_screen *vws = CALLOC_STRUCT(vmw_winsys_screen); - if (!vws) - goto out_no_vws; - - vws->ioctl.drm_fd = fd; - vws->use_old_scanout_flag = use_old_scanout_flag; - debug_printf("%s: use_old_scanout_flag == %s\n", __FUNCTION__, - use_old_scanout_flag ? "true" : "false"); - - if (!vmw_ioctl_init(vws)) - goto out_no_ioctl; - - if(!vmw_pools_init(vws)) - goto out_no_pools; - - if (!vmw_winsys_screen_init_svga(vws)) - goto out_no_svga; - - return vws; -out_no_svga: - vmw_pools_cleanup(vws); -out_no_pools: - vmw_ioctl_cleanup(vws); -out_no_ioctl: - FREE(vws); -out_no_vws: - return NULL; -} - -void -vmw_winsys_destroy(struct vmw_winsys_screen *vws) -{ - vmw_pools_cleanup(vws); - vmw_ioctl_cleanup(vws); - FREE(vws); -} diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen.h b/src/gallium/winsys/drm/vmware/core/vmw_screen.h deleted file mode 100644 index d3f2c2c7f5..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen.h +++ /dev/null @@ -1,140 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * Common definitions for the VMware SVGA winsys. - * - * @author Jose Fonseca <jfonseca@vmware.com> - */ - - -#ifndef VMW_SCREEN_H_ -#define VMW_SCREEN_H_ - - -#include "pipe/p_compiler.h" -#include "pipe/p_state.h" - -#include "svga_winsys.h" - - -#define VMW_GMR_POOL_SIZE (16*1024*1024) - - -struct pb_manager; -struct vmw_region; - - -struct vmw_winsys_screen -{ - struct svga_winsys_screen base; - - boolean use_old_scanout_flag; - - struct { - volatile uint32_t *fifo_map; - uint64_t last_fence; - int drm_fd; - } ioctl; - - struct { - struct pb_manager *gmr; - struct pb_manager *gmr_mm; - struct pb_manager *gmr_fenced; - } pools; -}; - - -static INLINE struct vmw_winsys_screen * -vmw_winsys_screen(struct svga_winsys_screen *base) -{ - return (struct vmw_winsys_screen *)base; -} - -/* */ -uint32 -vmw_ioctl_context_create(struct vmw_winsys_screen *vws); - -void -vmw_ioctl_context_destroy(struct vmw_winsys_screen *vws, - uint32 cid); - -uint32 -vmw_ioctl_surface_create(struct vmw_winsys_screen *vws, - SVGA3dSurfaceFlags flags, - SVGA3dSurfaceFormat format, - SVGA3dSize size, - uint32 numFaces, - uint32 numMipLevels); - -void -vmw_ioctl_surface_destroy(struct vmw_winsys_screen *vws, - uint32 sid); - -void -vmw_ioctl_command(struct vmw_winsys_screen *vws, - void *commands, - uint32_t size, - uint32_t *fence); - -struct vmw_region * -vmw_ioctl_region_create(struct vmw_winsys_screen *vws, uint32_t size); - -void -vmw_ioctl_region_destroy(struct vmw_region *region); - -struct SVGAGuestPtr -vmw_ioctl_region_ptr(struct vmw_region *region); - -void * -vmw_ioctl_region_map(struct vmw_region *region); -void -vmw_ioctl_region_unmap(struct vmw_region *region); - - -int -vmw_ioctl_fence_finish(struct vmw_winsys_screen *vws, - uint32_t fence); - -int -vmw_ioctl_fence_signalled(struct vmw_winsys_screen *vws, - uint32_t fence); - - -/* Initialize parts of vmw_winsys_screen at startup: - */ -boolean vmw_ioctl_init(struct vmw_winsys_screen *vws); -boolean vmw_pools_init(struct vmw_winsys_screen *vws); -boolean vmw_winsys_screen_init_svga(struct vmw_winsys_screen *vws); - -void vmw_ioctl_cleanup(struct vmw_winsys_screen *vws); -void vmw_pools_cleanup(struct vmw_winsys_screen *vws); - -struct vmw_winsys_screen *vmw_winsys_create(int fd, boolean use_old_scanout_flag); -void vmw_winsys_destroy(struct vmw_winsys_screen *sws); - - -#endif /* VMW_SCREEN_H_ */ diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c b/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c deleted file mode 100644 index 657544dcb2..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen_dri.c +++ /dev/null @@ -1,373 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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_inlines.h" -#include "util/u_memory.h" -#include "util/u_format.h" -#include "vmw_screen.h" - -#include "trace/tr_drm.h" - -#include "vmw_screen.h" -#include "vmw_surface.h" -#include "vmw_fence.h" -#include "vmw_context.h" - -#include <state_tracker/dri1_api.h> -#include <state_tracker/drm_api.h> -#include <vmwgfx_drm.h> -#include <xf86drm.h> - -#include <stdio.h> - -static struct svga_winsys_surface * -vmw_drm_surface_from_handle(struct svga_winsys_screen *sws, - struct winsys_handle *whandle, - SVGA3dSurfaceFormat *format); -static boolean -vmw_drm_surface_get_handle(struct svga_winsys_screen *sws, - struct svga_winsys_surface *surface, - unsigned stride, - struct winsys_handle *whandle); - -static struct dri1_api dri1_api_hooks; -static struct dri1_api_version ddx_required = { 0, 1, 0 }; -static struct dri1_api_version ddx_compat = { 0, 0, 0 }; -static struct dri1_api_version dri_required = { 4, 0, 0 }; -static struct dri1_api_version dri_compat = { 4, 0, 0 }; -static struct dri1_api_version drm_required = { 1, 0, 0 }; -static struct dri1_api_version drm_compat = { 1, 0, 0 }; -static struct dri1_api_version drm_scanout = { 0, 9, 0 }; - -static boolean -vmw_dri1_check_version(const struct dri1_api_version *cur, - const struct dri1_api_version *required, - const struct dri1_api_version *compat, - const char component[]) -{ - if (cur->major > required->major && cur->major <= compat->major) - return TRUE; - if (cur->major == required->major && cur->minor >= required->minor) - return TRUE; - - fprintf(stderr, "%s version failure.\n", component); - fprintf(stderr, "%s version is %d.%d.%d and this driver can only work\n" - "with versions %d.%d.x through %d.x.x.\n", - component, - cur->major, - cur->minor, - cur->patch_level, required->major, required->minor, compat->major); - return FALSE; -} - -/* This is actually the entrypoint to the entire driver, called by the - * libGL (or EGL, or ...) code via the drm_api_hooks table at the - * bottom of the file. - */ -static struct pipe_screen * -vmw_drm_create_screen(struct drm_api *drm_api, - int fd, - struct drm_create_screen_arg *arg) -{ - struct vmw_winsys_screen *vws; - struct pipe_screen *screen; - struct dri1_create_screen_arg *dri1; - boolean use_old_scanout_flag = FALSE; - - if (!arg || arg->mode == DRM_CREATE_NORMAL) { - struct dri1_api_version drm_ver; - drmVersionPtr ver; - - ver = drmGetVersion(fd); - if (ver == NULL) - return NULL; - - drm_ver.major = ver->version_major; - drm_ver.minor = ver->version_minor; - drm_ver.patch_level = 0; /* ??? */ - - drmFreeVersion(ver); - if (!vmw_dri1_check_version(&drm_ver, &drm_required, - &drm_compat, "vmwgfx drm driver")) - return NULL; - - if (!vmw_dri1_check_version(&drm_ver, &drm_scanout, - &drm_compat, "use old scanout field (not a error)")) - use_old_scanout_flag = TRUE; - } - - if (arg != NULL) { - switch (arg->mode) { - case DRM_CREATE_NORMAL: - break; - case DRM_CREATE_DRI1: - dri1 = (struct dri1_create_screen_arg *)arg; - if (!vmw_dri1_check_version(&dri1->ddx_version, &ddx_required, - &ddx_compat, "ddx - driver api")) - return NULL; - if (!vmw_dri1_check_version(&dri1->dri_version, &dri_required, - &dri_compat, "dri info")) - return NULL; - if (!vmw_dri1_check_version(&dri1->drm_version, &drm_required, - &drm_compat, "vmwgfx drm driver")) - return NULL; - if (!vmw_dri1_check_version(&dri1->drm_version, &drm_scanout, - &drm_compat, "use old scanout field (not a error)")) - use_old_scanout_flag = TRUE; - dri1->api = &dri1_api_hooks; -#if 0 - break; -#else - assert(!"No dri 1 support for now\n"); - return NULL; -#endif - default: - return NULL; - } - } - - vws = vmw_winsys_create( fd, use_old_scanout_flag ); - if (!vws) - goto out_no_vws; - - /* XXX do this properly */ - vws->base.surface_from_handle = vmw_drm_surface_from_handle; - vws->base.surface_get_handle = vmw_drm_surface_get_handle; - - screen = svga_screen_create( &vws->base ); - if (!screen) - goto out_no_screen; - - return screen; - - /* Failure cases: - */ -out_no_screen: - vmw_winsys_destroy( vws ); - -out_no_vws: - return NULL; -} - -static INLINE boolean -vmw_dri1_intersect_src_bbox(struct drm_clip_rect *dst, - int dst_x, - int dst_y, - const struct drm_clip_rect *src, - const struct drm_clip_rect *bbox) -{ - int xy1; - int xy2; - - xy1 = ((int)src->x1 > (int)bbox->x1 + dst_x) ? src->x1 : - (int)bbox->x1 + dst_x; - xy2 = ((int)src->x2 < (int)bbox->x2 + dst_x) ? src->x2 : - (int)bbox->x2 + dst_x; - if (xy1 >= xy2 || xy1 < 0) - return FALSE; - - dst->x1 = xy1; - dst->x2 = xy2; - - xy1 = ((int)src->y1 > (int)bbox->y1 + dst_y) ? src->y1 : - (int)bbox->y1 + dst_y; - xy2 = ((int)src->y2 < (int)bbox->y2 + dst_y) ? src->y2 : - (int)bbox->y2 + dst_y; - if (xy1 >= xy2 || xy1 < 0) - return FALSE; - - dst->y1 = xy1; - dst->y2 = xy2; - return TRUE; -} - -/** - * No fancy get-surface-from-sarea stuff here. - * Just use the present blit. - */ - -static void -vmw_dri1_present_locked(struct pipe_context *locked_pipe, - struct pipe_surface *surf, - const struct drm_clip_rect *rect, - unsigned int num_clip, - int x_draw, int y_draw, - const struct drm_clip_rect *bbox, - struct pipe_fence_handle **p_fence) -{ -#if 0 - struct svga_winsys_surface *srf = - svga_screen_texture_get_winsys_surface(surf->texture); - struct vmw_svga_winsys_surface *vsrf = vmw_svga_winsys_surface(srf); - struct vmw_winsys_screen *vws = - vmw_winsys_screen(svga_winsys_screen(locked_pipe->screen)); - struct drm_clip_rect clip; - int i; - struct - { - SVGA3dCmdHeader header; - SVGA3dCmdPresent body; - SVGA3dCopyRect rect; - } cmd; - boolean visible = FALSE; - uint32_t fence_seq = 0; - - VMW_FUNC; - cmd.header.id = SVGA_3D_CMD_PRESENT; - cmd.header.size = sizeof cmd.body + sizeof cmd.rect; - cmd.body.sid = vsrf->sid; - - for (i = 0; i < num_clip; ++i) { - if (!vmw_dri1_intersect_src_bbox(&clip, x_draw, y_draw, rect++, bbox)) - continue; - - cmd.rect.x = clip.x1; - cmd.rect.y = clip.y1; - cmd.rect.w = clip.x2 - clip.x1; - cmd.rect.h = clip.y2 - clip.y1; - cmd.rect.srcx = (int)clip.x1 - x_draw; - cmd.rect.srcy = (int)clip.y1 - y_draw; - - vmw_printf("%s: Clip %d x %d y %d w %d h %d srcx %d srcy %d\n", - __FUNCTION__, - i, - cmd.rect.x, - cmd.rect.y, - cmd.rect.w, cmd.rect.h, cmd.rect.srcx, cmd.rect.srcy); - - vmw_ioctl_command(vws, &cmd, sizeof cmd.header + cmd.header.size, - &fence_seq); - visible = TRUE; - } - - *p_fence = (visible) ? vmw_pipe_fence(fence_seq) : NULL; - vmw_svga_winsys_surface_reference(&vsrf, NULL); -#else - assert(!"No dri 1 support for now\n"); -#endif -} - -static struct svga_winsys_surface * -vmw_drm_surface_from_handle(struct svga_winsys_screen *sws, - struct winsys_handle *whandle, - SVGA3dSurfaceFormat *format) -{ - struct vmw_svga_winsys_surface *vsrf; - struct svga_winsys_surface *ssrf; - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - union drm_vmw_surface_reference_arg arg; - struct drm_vmw_surface_arg *req = &arg.req; - struct drm_vmw_surface_create_req *rep = &arg.rep; - int ret; - int i; - - /** - * The vmware device specific handle is the hardware SID. - * FIXME: We probably want to move this to the ioctl implementations. - */ - - memset(&arg, 0, sizeof(arg)); - req->sid = whandle->handle; - - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_REF_SURFACE, - &arg, sizeof(arg)); - - if (ret) { - fprintf(stderr, "Failed referencing shared surface. SID %d.\n" - "Error %d (%s).\n", - whandle->handle, ret, strerror(-ret)); - return NULL; - } - - if (rep->mip_levels[0] != 1) { - fprintf(stderr, "Incorrect number of mipmap levels on shared surface." - " SID %d, levels %d\n", - whandle->handle, rep->mip_levels[0]); - goto out_mip; - } - - for (i=1; i < DRM_VMW_MAX_SURFACE_FACES; ++i) { - if (rep->mip_levels[i] != 0) { - fprintf(stderr, "Incorrect number of faces levels on shared surface." - " SID %d, face %d present.\n", - whandle->handle, i); - goto out_mip; - } - } - - vsrf = CALLOC_STRUCT(vmw_svga_winsys_surface); - if (!vsrf) - goto out_mip; - - pipe_reference_init(&vsrf->refcnt, 1); - p_atomic_set(&vsrf->validated, 0); - vsrf->screen = vws; - vsrf->sid = whandle->handle; - ssrf = svga_winsys_surface(vsrf); - *format = rep->format; - - return ssrf; - -out_mip: - vmw_ioctl_surface_destroy(vws, whandle->handle); - return NULL; -} - -static boolean -vmw_drm_surface_get_handle(struct svga_winsys_screen *sws, - struct svga_winsys_surface *surface, - unsigned stride, - struct winsys_handle *whandle) -{ - struct vmw_svga_winsys_surface *vsrf; - - if (!surface) - return FALSE; - - vsrf = vmw_svga_winsys_surface(surface); - whandle->handle = vsrf->sid; - whandle->stride = stride; - - return TRUE; -} - - -static struct dri1_api dri1_api_hooks = { - .front_srf_locked = NULL, - .present_locked = vmw_dri1_present_locked -}; - -static struct drm_api vmw_drm_api_hooks = { - .name = "vmwgfx", - .driver_name = "vmwgfx", - .create_screen = vmw_drm_create_screen, -}; - -struct drm_api* drm_api_create() -{ - return trace_drm_create(&vmw_drm_api_hooks); -} diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen_ioctl.c b/src/gallium/winsys/drm/vmware/core/vmw_screen_ioctl.c deleted file mode 100644 index 5d81fa8c4a..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen_ioctl.c +++ /dev/null @@ -1,529 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * - * Wrappers for DRM ioctl functionlaity used by the rest of the vmw - * drm winsys. - * - * Based on svgaicd_escape.c - */ - - -#include "svga_cmd.h" -#include "util/u_memory.h" -#include "util/u_math.h" -#include "svgadump/svga_dump.h" -#include "vmw_screen.h" -#include "vmw_context.h" -#include "xf86drm.h" -#include "vmwgfx_drm.h" - -#include <sys/mman.h> -#include <errno.h> -#include <unistd.h> - -struct vmw_region -{ - SVGAGuestPtr ptr; - uint32_t handle; - uint64_t map_handle; - void *data; - uint32_t map_count; - int drm_fd; - uint32_t size; -}; - -/* XXX: This isn't a real hardware flag, but just a hack for kernel to - * know about primary surfaces. In newer versions of the kernel - * interface the driver uses a special field. - */ -#define SVGA3D_SURFACE_HINT_SCANOUT (1 << 9) - -static void -vmw_check_last_cmd(struct vmw_winsys_screen *vws) -{ - static uint32_t buffer[16384]; - struct drm_vmw_fifo_debug_arg arg; - int ret; - - return; - memset(&arg, 0, sizeof(arg)); - arg.debug_buffer = (unsigned long)buffer; - arg.debug_buffer_size = 65536; - - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_FIFO_DEBUG, - &arg, sizeof(arg)); - - if (ret) { - debug_printf("%s Ioctl error: \"%s\".\n", __FUNCTION__, strerror(-ret)); - return; - } - - if (arg.did_not_fit) { - debug_printf("%s Command did not fit completely.\n", __FUNCTION__); - } - - svga_dump_commands(buffer, arg.used_size); -} - -static void -vmw_ioctl_fifo_unmap(struct vmw_winsys_screen *vws, void *mapping) -{ - VMW_FUNC; - (void)munmap(mapping, getpagesize()); -} - - -static void * -vmw_ioctl_fifo_map(struct vmw_winsys_screen *vws, - uint32_t fifo_offset ) -{ - void *map; - - VMW_FUNC; - - map = mmap(NULL, getpagesize(), PROT_READ, MAP_SHARED, - vws->ioctl.drm_fd, fifo_offset); - - if (map == MAP_FAILED) { - debug_printf("Map failed %s\n", strerror(errno)); - return NULL; - } - - vmw_printf("Fifo (min) is 0x%08x\n", ((uint32_t *) map)[SVGA_FIFO_MIN]); - - return map; -} - -uint32 -vmw_ioctl_context_create(struct vmw_winsys_screen *vws) -{ - struct drm_vmw_context_arg c_arg; - int ret; - - VMW_FUNC; - - ret = drmCommandRead(vws->ioctl.drm_fd, DRM_VMW_CREATE_CONTEXT, - &c_arg, sizeof(c_arg)); - - if (ret) - return -1; - - vmw_check_last_cmd(vws); - vmw_printf("Context id is %d\n", c_arg.cid); - - return c_arg.cid; -} - -void -vmw_ioctl_context_destroy(struct vmw_winsys_screen *vws, uint32 cid) -{ - struct drm_vmw_context_arg c_arg; - - VMW_FUNC; - - memset(&c_arg, 0, sizeof(c_arg)); - c_arg.cid = cid; - - (void)drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_UNREF_CONTEXT, - &c_arg, sizeof(c_arg)); - - vmw_check_last_cmd(vws); -} - -uint32 -vmw_ioctl_surface_create(struct vmw_winsys_screen *vws, - SVGA3dSurfaceFlags flags, - SVGA3dSurfaceFormat format, - SVGA3dSize size, - uint32_t numFaces, uint32_t numMipLevels) -{ - union drm_vmw_surface_create_arg s_arg; - struct drm_vmw_surface_create_req *req = &s_arg.req; - struct drm_vmw_surface_arg *rep = &s_arg.rep; - struct drm_vmw_size sizes[DRM_VMW_MAX_SURFACE_FACES* - DRM_VMW_MAX_MIP_LEVELS]; - struct drm_vmw_size *cur_size; - uint32_t iFace; - uint32_t iMipLevel; - int ret; - - vmw_printf("%s flags %d format %d\n", __FUNCTION__, flags, format); - - memset(&s_arg, 0, sizeof(s_arg)); - if (vws->use_old_scanout_flag && - (flags & SVGA3D_SURFACE_HINT_SCANOUT)) { - req->flags = (uint32_t) flags; - req->scanout = false; - } else if (flags & SVGA3D_SURFACE_HINT_SCANOUT) { - req->flags = (uint32_t) (flags & ~SVGA3D_SURFACE_HINT_SCANOUT); - req->scanout = true; - } else { - req->flags = (uint32_t) flags; - req->scanout = false; - } - req->format = (uint32_t) format; - req->shareable = 1; - - assert(numFaces * numMipLevels < DRM_VMW_MAX_SURFACE_FACES* - DRM_VMW_MAX_MIP_LEVELS); - cur_size = sizes; - for (iFace = 0; iFace < numFaces; ++iFace) { - SVGA3dSize mipSize = size; - - req->mip_levels[iFace] = numMipLevels; - for (iMipLevel = 0; iMipLevel < numMipLevels; ++iMipLevel) { - cur_size->width = mipSize.width; - cur_size->height = mipSize.height; - cur_size->depth = mipSize.depth; - mipSize.width = MAX2(mipSize.width >> 1, 1); - mipSize.height = MAX2(mipSize.height >> 1, 1); - mipSize.depth = MAX2(mipSize.depth >> 1, 1); - cur_size++; - } - } - for (iFace = numFaces; iFace < SVGA3D_MAX_SURFACE_FACES; ++iFace) { - req->mip_levels[iFace] = 0; - } - - req->size_addr = (unsigned long)&sizes; - - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_CREATE_SURFACE, - &s_arg, sizeof(s_arg)); - - if (ret) - return -1; - - vmw_printf("Surface id is %d\n", rep->sid); - vmw_check_last_cmd(vws); - - return rep->sid; -} - -void -vmw_ioctl_surface_destroy(struct vmw_winsys_screen *vws, uint32 sid) -{ - struct drm_vmw_surface_arg s_arg; - - VMW_FUNC; - - memset(&s_arg, 0, sizeof(s_arg)); - s_arg.sid = sid; - - (void)drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_UNREF_SURFACE, - &s_arg, sizeof(s_arg)); - vmw_check_last_cmd(vws); - -} - -void -vmw_ioctl_command(struct vmw_winsys_screen *vws, void *commands, uint32_t size, - uint32_t * pfence) -{ - struct drm_vmw_execbuf_arg arg; - struct drm_vmw_fence_rep rep; - int ret; - -#ifdef DEBUG - { - static boolean firsttime = TRUE; - static boolean debug = FALSE; - static boolean skip = FALSE; - if (firsttime) { - debug = debug_get_bool_option("SVGA_DUMP_CMD", FALSE); - skip = debug_get_bool_option("SVGA_SKIP_CMD", FALSE); - } - if (debug) { - VMW_FUNC; - svga_dump_commands(commands, size); - } - firsttime = FALSE; - if (skip) { - size = 0; - } - } -#endif - - memset(&arg, 0, sizeof(arg)); - memset(&rep, 0, sizeof(rep)); - - rep.error = -EFAULT; - arg.fence_rep = (unsigned long)&rep; - arg.commands = (unsigned long)commands; - arg.command_size = size; - - do { - ret = drmCommandWrite(vws->ioctl.drm_fd, DRM_VMW_EXECBUF, &arg, sizeof(arg)); - } while(ret == -ERESTART); - if (ret) { - debug_printf("%s error %s.\n", __FUNCTION__, strerror(-ret)); - } - if (rep.error) { - - /* - * Kernel has synced and put the last fence sequence in the FIFO - * register. - */ - - if (rep.error == -EFAULT) - rep.fence_seq = vws->ioctl.fifo_map[SVGA_FIFO_FENCE]; - - debug_printf("%s Fence error %s.\n", __FUNCTION__, - strerror(-rep.error)); - } - - vws->ioctl.last_fence = rep.fence_seq; - - if (pfence) - *pfence = rep.fence_seq; - vmw_check_last_cmd(vws); - -} - - -struct vmw_region * -vmw_ioctl_region_create(struct vmw_winsys_screen *vws, uint32_t size) -{ - struct vmw_region *region; - union drm_vmw_alloc_dmabuf_arg arg; - struct drm_vmw_alloc_dmabuf_req *req = &arg.req; - struct drm_vmw_dmabuf_rep *rep = &arg.rep; - int ret; - - vmw_printf("%s: size = %u\n", __FUNCTION__, size); - - region = CALLOC_STRUCT(vmw_region); - if (!region) - goto out_err1; - - memset(&arg, 0, sizeof(arg)); - req->size = size; - do { - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_ALLOC_DMABUF, &arg, - sizeof(arg)); - } while (ret == -ERESTART); - - if (ret) { - debug_printf("IOCTL failed %d: %s\n", ret, strerror(-ret)); - goto out_err1; - } - - region->ptr.gmrId = rep->cur_gmr_id; - region->ptr.offset = rep->cur_gmr_offset; - region->data = NULL; - region->handle = rep->handle; - region->map_handle = rep->map_handle; - region->map_count = 0; - region->size = size; - region->drm_fd = vws->ioctl.drm_fd; - - vmw_printf(" gmrId = %u, offset = %u\n", - region->ptr.gmrId, region->ptr.offset); - - return region; - - out_err1: - FREE(region); - return NULL; -} - -void -vmw_ioctl_region_destroy(struct vmw_region *region) -{ - struct drm_vmw_unref_dmabuf_arg arg; - - vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__, - region->ptr.gmrId, region->ptr.offset); - - if (region->data) { - munmap(region->data, region->size); - region->data = NULL; - } - - memset(&arg, 0, sizeof(arg)); - arg.handle = region->handle; - drmCommandWrite(region->drm_fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg)); - - FREE(region); -} - -SVGAGuestPtr -vmw_ioctl_region_ptr(struct vmw_region *region) -{ - return region->ptr; -} - -void * -vmw_ioctl_region_map(struct vmw_region *region) -{ - void *map; - - vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__, - region->ptr.gmrId, region->ptr.offset); - - if (region->data == NULL) { - map = mmap(NULL, region->size, PROT_READ | PROT_WRITE, MAP_SHARED, - region->drm_fd, region->map_handle); - if (map == MAP_FAILED) { - debug_printf("%s: Map failed.\n", __FUNCTION__); - return NULL; - } - - region->data = map; - } - - ++region->map_count; - - return region->data; -} - -void -vmw_ioctl_region_unmap(struct vmw_region *region) -{ - vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__, - region->ptr.gmrId, region->ptr.offset); - --region->map_count; -} - - -int -vmw_ioctl_fence_signalled(struct vmw_winsys_screen *vws, - uint32_t fence) -{ - uint32_t expected; - uint32_t current; - - assert(fence); - if(!fence) - return 0; - - expected = fence; - current = vws->ioctl.fifo_map[SVGA_FIFO_FENCE]; - - if ((int32)(current - expected) >= 0) - return 0; /* fence passed */ - else - return -1; -} - - -static void -vmw_ioctl_sync(struct vmw_winsys_screen *vws, - uint32_t fence) -{ - uint32_t cur_fence; - struct drm_vmw_fence_wait_arg arg; - int ret; - - vmw_printf("%s: fence = %lu\n", __FUNCTION__, - (unsigned long)fence); - - cur_fence = vws->ioctl.fifo_map[SVGA_FIFO_FENCE]; - vmw_printf("%s: Fence id read is 0x%08x\n", __FUNCTION__, - (unsigned int)cur_fence); - - if ((cur_fence - fence) < (1 << 24)) - return; - - memset(&arg, 0, sizeof(arg)); - arg.sequence = fence; - - do { - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_FENCE_WAIT, &arg, - sizeof(arg)); - } while (ret == -ERESTART); -} - - -int -vmw_ioctl_fence_finish(struct vmw_winsys_screen *vws, - uint32_t fence) -{ - assert(fence); - - if(fence) { - if(vmw_ioctl_fence_signalled(vws, fence) != 0) { - vmw_ioctl_sync(vws, fence); - } - } - - return 0; -} - - -boolean -vmw_ioctl_init(struct vmw_winsys_screen *vws) -{ - struct drm_vmw_getparam_arg gp_arg; - int ret; - - VMW_FUNC; - - memset(&gp_arg, 0, sizeof(gp_arg)); - gp_arg.param = DRM_VMW_PARAM_3D; - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM, - &gp_arg, sizeof(gp_arg)); - if (ret || gp_arg.value == 0) { - debug_printf("No 3D enabled (%i, %s)\n", ret, strerror(-ret)); - goto out_err1; - } - - memset(&gp_arg, 0, sizeof(gp_arg)); - gp_arg.param = DRM_VMW_PARAM_FIFO_OFFSET; - ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM, - &gp_arg, sizeof(gp_arg)); - - if (ret) { - debug_printf("GET_PARAM on %d returned %d: %s\n", - vws->ioctl.drm_fd, ret, strerror(-ret)); - goto out_err1; - } - - vmw_printf("Offset to map is 0x%08llx\n", - (unsigned long long)gp_arg.value); - - vws->ioctl.fifo_map = vmw_ioctl_fifo_map(vws, gp_arg.value); - if (vws->ioctl.fifo_map == NULL) - goto out_err1; - - vmw_printf("%s OK\n", __FUNCTION__); - return TRUE; - - out_err1: - debug_printf("%s Failed\n", __FUNCTION__); - return FALSE; -} - - - -void -vmw_ioctl_cleanup(struct vmw_winsys_screen *vws) -{ - VMW_FUNC; - - vmw_ioctl_fifo_unmap(vws, (void *)vws->ioctl.fifo_map); -} diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen_pools.c b/src/gallium/winsys/drm/vmware/core/vmw_screen_pools.c deleted file mode 100644 index b9823d7857..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen_pools.c +++ /dev/null @@ -1,97 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 "vmw_screen.h" - -#include "vmw_buffer.h" -#include "vmw_fence.h" - -#include "pipebuffer/pb_buffer.h" -#include "pipebuffer/pb_bufmgr.h" - -void -vmw_pools_cleanup(struct vmw_winsys_screen *vws) -{ - if(vws->pools.gmr_fenced) - vws->pools.gmr_fenced->destroy(vws->pools.gmr_fenced); - - /* gmr_mm pool is already destroyed above */ - - if(vws->pools.gmr) - vws->pools.gmr->destroy(vws->pools.gmr); -} - - -boolean -vmw_pools_init(struct vmw_winsys_screen *vws) -{ - vws->pools.gmr = vmw_gmr_bufmgr_create(vws); - if(!vws->pools.gmr) - goto error; - - vws->pools.gmr_mm = mm_bufmgr_create(vws->pools.gmr, - VMW_GMR_POOL_SIZE, - 12 /* 4096 alignment */); - if(!vws->pools.gmr_mm) - goto error; - - /* - * GMR buffers are typically shortlived, but it's possible that at a given - * instance a buffer is mapped. So to avoid stalling we tell pipebuffer to - * forbid creation of buffers beyond half the GMR pool size, - * - * XXX: It is unclear weather we want to limit the total amount of temporary - * malloc memory used to backup unvalidated GMR buffers. On one hand it is - * preferrable to fail an allocation than exhausting the guest memory with - * temporary data, but on the other hand it is possible that a stupid - * application creates large vertex buffers and does not use them for a long - * time -- since the svga pipe driver only emits the DMA uploads when a - * buffer is used for drawing this would effectively disabling swapping GMR - * buffers to memory. So far, the preemptively flush already seems to keep - * total allocated memory within relatively small numbers, so we don't - * limit. - */ - vws->pools.gmr_fenced = fenced_bufmgr_create( - vws->pools.gmr_mm, - vmw_fence_ops_create(vws), - VMW_GMR_POOL_SIZE/2, - ~0); - -#ifdef DEBUG - vws->pools.gmr_fenced = pb_debug_manager_create(vws->pools.gmr_fenced, - 4096, - 4096); -#endif - if(!vws->pools.gmr_fenced) - goto error; - - return TRUE; - -error: - vmw_pools_cleanup(vws); - return FALSE; -} - diff --git a/src/gallium/winsys/drm/vmware/core/vmw_screen_svga.c b/src/gallium/winsys/drm/vmware/core/vmw_screen_svga.c deleted file mode 100644 index 2b4e80f003..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_screen_svga.c +++ /dev/null @@ -1,295 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * This file implements the SVGA interface into this winsys, defined - * in drivers/svga/svga_winsys.h. - * - * @author Keith Whitwell - * @author Jose Fonseca - */ - - -#include "svga_cmd.h" -#include "svga3d_caps.h" - -#include "util/u_inlines.h" -#include "util/u_math.h" -#include "util/u_memory.h" -#include "pipebuffer/pb_buffer.h" -#include "pipebuffer/pb_bufmgr.h" -#include "svga_winsys.h" -#include "vmw_context.h" -#include "vmw_screen.h" -#include "vmw_surface.h" -#include "vmw_buffer.h" -#include "vmw_fence.h" - - -static struct svga_winsys_buffer * -vmw_svga_winsys_buffer_create(struct svga_winsys_screen *sws, - unsigned alignment, - unsigned usage, - unsigned size) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - struct pb_desc desc; - struct pb_manager *provider; - struct pb_buffer *buffer; - - memset(&desc, 0, sizeof desc); - desc.alignment = alignment; - desc.usage = usage; - - provider = vws->pools.gmr_fenced; - - assert(provider); - buffer = provider->create_buffer(provider, size, &desc); - if(!buffer) - return NULL; - - return vmw_svga_winsys_buffer(buffer); -} - - -static void * -vmw_svga_winsys_buffer_map(struct svga_winsys_screen *sws, - struct svga_winsys_buffer *buf, - unsigned flags) -{ - (void)sws; - return pb_map(vmw_pb_buffer(buf), flags); -} - - -static void -vmw_svga_winsys_buffer_unmap(struct svga_winsys_screen *sws, - struct svga_winsys_buffer *buf) -{ - (void)sws; - pb_unmap(vmw_pb_buffer(buf)); -} - - -static void -vmw_svga_winsys_buffer_destroy(struct svga_winsys_screen *sws, - struct svga_winsys_buffer *buf) -{ - struct pb_buffer *pbuf = vmw_pb_buffer(buf); - (void)sws; - pb_reference(&pbuf, NULL); -} - - -static void -vmw_svga_winsys_fence_reference(struct svga_winsys_screen *sws, - struct pipe_fence_handle **pdst, - struct pipe_fence_handle *src) -{ - (void)sws; - *pdst = src; -} - - -static int -vmw_svga_winsys_fence_signalled(struct svga_winsys_screen *sws, - struct pipe_fence_handle *fence, - unsigned flag) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - (void)flag; - return vmw_ioctl_fence_signalled(vws, vmw_fence(fence)); -} - - -static int -vmw_svga_winsys_fence_finish(struct svga_winsys_screen *sws, - struct pipe_fence_handle *fence, - unsigned flag) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - (void)flag; - return vmw_ioctl_fence_finish(vws, vmw_fence(fence)); -} - - - -static struct svga_winsys_surface * -vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, - SVGA3dSurfaceFlags flags, - SVGA3dSurfaceFormat format, - SVGA3dSize size, - uint32 numFaces, - uint32 numMipLevels) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - struct vmw_svga_winsys_surface *surface; - - surface = CALLOC_STRUCT(vmw_svga_winsys_surface); - if(!surface) - goto no_surface; - - pipe_reference_init(&surface->refcnt, 1); - p_atomic_set(&surface->validated, 0); - surface->screen = vws; - surface->sid = vmw_ioctl_surface_create(vws, - flags, format, size, - numFaces, numMipLevels); - if(surface->sid == SVGA3D_INVALID_ID) - goto no_sid; - - return svga_winsys_surface(surface); - -no_sid: - FREE(surface); -no_surface: - return NULL; -} - - -static boolean -vmw_svga_winsys_surface_is_flushed(struct svga_winsys_screen *sws, - struct svga_winsys_surface *surface) -{ - struct vmw_svga_winsys_surface *vsurf = vmw_svga_winsys_surface(surface); - return (p_atomic_read(&vsurf->validated) == 0); -} - - -static void -vmw_svga_winsys_surface_ref(struct svga_winsys_screen *sws, - struct svga_winsys_surface **pDst, - struct svga_winsys_surface *src) -{ - struct vmw_svga_winsys_surface *d_vsurf = vmw_svga_winsys_surface(*pDst); - struct vmw_svga_winsys_surface *s_vsurf = vmw_svga_winsys_surface(src); - - vmw_svga_winsys_surface_reference(&d_vsurf, s_vsurf); - *pDst = svga_winsys_surface(d_vsurf); -} - - -static void -vmw_svga_winsys_destroy(struct svga_winsys_screen *sws) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - - vmw_winsys_destroy(vws); -} - - -static boolean -vmw_svga_winsys_get_cap(struct svga_winsys_screen *sws, - SVGA3dDevCapIndex index, - SVGA3dDevCapResult *result) -{ - struct vmw_winsys_screen *vws = vmw_winsys_screen(sws); - const uint32 *capsBlock; - const SVGA3dCapsRecord *capsRecord = NULL; - uint32 offset; - const SVGA3dCapPair *capArray; - int numCaps, first, last; - - if(!vws->ioctl.fifo_map) - return FALSE; - - if(vws->ioctl.fifo_map[SVGA_FIFO_3D_HWVERSION] < SVGA3D_HWVERSION_WS6_B1) - return FALSE; - - /* - * Search linearly through the caps block records for the specified type. - */ - capsBlock = (const uint32 *)&vws->ioctl.fifo_map[SVGA_FIFO_3D_CAPS]; - for (offset = 0; capsBlock[offset] != 0; offset += capsBlock[offset]) { - const SVGA3dCapsRecord *record; - assert(offset < SVGA_FIFO_3D_CAPS_SIZE); - record = (const SVGA3dCapsRecord *) (capsBlock + offset); - if ((record->header.type >= SVGA3DCAPS_RECORD_DEVCAPS_MIN) && - (record->header.type <= SVGA3DCAPS_RECORD_DEVCAPS_MAX) && - (!capsRecord || (record->header.type > capsRecord->header.type))) { - capsRecord = record; - } - } - - if(!capsRecord) - return FALSE; - - /* - * Calculate the number of caps from the size of the record. - */ - capArray = (const SVGA3dCapPair *) capsRecord->data; - numCaps = (int) ((capsRecord->header.length * sizeof(uint32) - - sizeof capsRecord->header) / (2 * sizeof(uint32))); - - /* - * Binary-search for the cap with the specified index. - */ - for (first = 0, last = numCaps - 1; first <= last; ) { - int mid = (first + last) / 2; - - if ((SVGA3dDevCapIndex) capArray[mid][0] == index) { - /* - * Found it. - */ - result->u = capArray[mid][1]; - return TRUE; - } - - /* - * Divide and conquer. - */ - if ((SVGA3dDevCapIndex) capArray[mid][0] > index) { - last = mid - 1; - } else { - first = mid + 1; - } - } - - return FALSE; -} - - -boolean -vmw_winsys_screen_init_svga(struct vmw_winsys_screen *vws) -{ - vws->base.destroy = vmw_svga_winsys_destroy; - vws->base.get_cap = vmw_svga_winsys_get_cap; - vws->base.context_create = vmw_svga_winsys_context_create; - vws->base.surface_create = vmw_svga_winsys_surface_create; - vws->base.surface_is_flushed = vmw_svga_winsys_surface_is_flushed; - vws->base.surface_reference = vmw_svga_winsys_surface_ref; - vws->base.buffer_create = vmw_svga_winsys_buffer_create; - vws->base.buffer_map = vmw_svga_winsys_buffer_map; - vws->base.buffer_unmap = vmw_svga_winsys_buffer_unmap; - vws->base.buffer_destroy = vmw_svga_winsys_buffer_destroy; - vws->base.fence_reference = vmw_svga_winsys_fence_reference; - vws->base.fence_signalled = vmw_svga_winsys_fence_signalled; - vws->base.fence_finish = vmw_svga_winsys_fence_finish; - - return TRUE; -} - - diff --git a/src/gallium/winsys/drm/vmware/core/vmw_surface.c b/src/gallium/winsys/drm/vmware/core/vmw_surface.c deleted file mode 100644 index 5f1b9ad577..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_surface.c +++ /dev/null @@ -1,61 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 "svga_cmd.h" -#include "util/u_debug.h" -#include "util/u_memory.h" - -#include "vmw_surface.h" -#include "vmw_screen.h" - -void -vmw_svga_winsys_surface_reference(struct vmw_svga_winsys_surface **pdst, - struct vmw_svga_winsys_surface *src) -{ - struct pipe_reference *src_ref; - struct pipe_reference *dst_ref; - struct vmw_svga_winsys_surface *dst; - - if(pdst == NULL || *pdst == src) - return; - - dst = *pdst; - - src_ref = src ? &src->refcnt : NULL; - dst_ref = dst ? &dst->refcnt : NULL; - - if (pipe_reference(dst_ref, src_ref)) { - vmw_ioctl_surface_destroy(dst->screen, dst->sid); -#ifdef DEBUG - /* to detect dangling pointers */ - assert(p_atomic_read(&dst->validated) == 0); - dst->sid = SVGA3D_INVALID_ID; -#endif - FREE(dst); - } - - *pdst = src; -} diff --git a/src/gallium/winsys/drm/vmware/core/vmw_surface.h b/src/gallium/winsys/drm/vmware/core/vmw_surface.h deleted file mode 100644 index 3d61595c28..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmw_surface.h +++ /dev/null @@ -1,79 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * Surfaces for VMware SVGA winsys. - * - * @author Jose Fonseca <jfonseca@vmware.com> - */ - - -#ifndef VMW_SURFACE_H_ -#define VMW_SURFACE_H_ - - -#include "pipe/p_compiler.h" -#include "util/u_atomic.h" -#include "util/u_inlines.h" - -#define VMW_MAX_PRESENTS 3 - - - -struct vmw_svga_winsys_surface -{ - int32_t validated; /* atomic */ - struct pipe_reference refcnt; - - struct vmw_winsys_screen *screen; - uint32_t sid; - - /* FIXME: make this thread safe */ - unsigned next_present_no; - uint32_t present_fences[VMW_MAX_PRESENTS]; -}; - - -static INLINE struct svga_winsys_surface * -svga_winsys_surface(struct vmw_svga_winsys_surface *surf) -{ - assert(!surf || surf->sid != SVGA3D_INVALID_ID); - return (struct svga_winsys_surface *)surf; -} - - -static INLINE struct vmw_svga_winsys_surface * -vmw_svga_winsys_surface(struct svga_winsys_surface *surf) -{ - return (struct vmw_svga_winsys_surface *)surf; -} - - -void -vmw_svga_winsys_surface_reference(struct vmw_svga_winsys_surface **pdst, - struct vmw_svga_winsys_surface *src); - -#endif /* VMW_SURFACE_H_ */ diff --git a/src/gallium/winsys/drm/vmware/core/vmwgfx_drm.h b/src/gallium/winsys/drm/vmware/core/vmwgfx_drm.h deleted file mode 100644 index 47914bdb71..0000000000 --- a/src/gallium/winsys/drm/vmware/core/vmwgfx_drm.h +++ /dev/null @@ -1,545 +0,0 @@ -/************************************************************************** - * - * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA - * 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 - * THE COPYRIGHT HOLDERS, AUTHORS 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 __VMWGFX_DRM_H__ -#define __VMWGFX_DRM_H__ - -#define DRM_VMW_MAX_SURFACE_FACES 6 -#define DRM_VMW_MAX_MIP_LEVELS 24 - -#define DRM_VMW_EXT_NAME_LEN 128 - -#define DRM_VMW_GET_PARAM 0 -#define DRM_VMW_ALLOC_DMABUF 1 -#define DRM_VMW_UNREF_DMABUF 2 -#define DRM_VMW_CURSOR_BYPASS 3 -/* guarded by DRM_VMW_PARAM_NUM_STREAMS != 0*/ -#define DRM_VMW_CONTROL_STREAM 4 -#define DRM_VMW_CLAIM_STREAM 5 -#define DRM_VMW_UNREF_STREAM 6 -/* guarded by DRM_VMW_PARAM_3D == 1 */ -#define DRM_VMW_CREATE_CONTEXT 7 -#define DRM_VMW_UNREF_CONTEXT 8 -#define DRM_VMW_CREATE_SURFACE 9 -#define DRM_VMW_UNREF_SURFACE 10 -#define DRM_VMW_REF_SURFACE 11 -#define DRM_VMW_EXECBUF 12 -#define DRM_VMW_FIFO_DEBUG 13 -#define DRM_VMW_FENCE_WAIT 14 - - -/*************************************************************************/ -/** - * DRM_VMW_GET_PARAM - get device information. - * - * DRM_VMW_PARAM_FIFO_OFFSET: - * Offset to use to map the first page of the FIFO read-only. - * The fifo is mapped using the mmap() system call on the drm device. - * - * DRM_VMW_PARAM_OVERLAY_IOCTL: - * Does the driver support the overlay ioctl. - */ - -#define DRM_VMW_PARAM_NUM_STREAMS 0 -#define DRM_VMW_PARAM_NUM_FREE_STREAMS 1 -#define DRM_VMW_PARAM_3D 2 -#define DRM_VMW_PARAM_FIFO_OFFSET 3 -#define DRM_VMW_PARAM_HW_CAPS 4 -#define DRM_VMW_PARAM_FIFO_CAPS 5 - -/** - * struct drm_vmw_getparam_arg - * - * @value: Returned value. //Out - * @param: Parameter to query. //In. - * - * Argument to the DRM_VMW_GET_PARAM Ioctl. - */ - -struct drm_vmw_getparam_arg { - uint64_t value; - uint32_t param; - uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CREATE_CONTEXT - Create a host context. - * - * Allocates a device unique context id, and queues a create context command - * for the host. Does not wait for host completion. - */ - -/** - * struct drm_vmw_context_arg - * - * @cid: Device unique context ID. - * - * Output argument to the DRM_VMW_CREATE_CONTEXT Ioctl. - * Input argument to the DRM_VMW_UNREF_CONTEXT Ioctl. - */ - -struct drm_vmw_context_arg { - int32_t cid; - uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_CONTEXT - Create a host context. - * - * Frees a global context id, and queues a destroy host command for the host. - * Does not wait for host completion. The context ID can be used directly - * in the command stream and shows up as the same context ID on the host. - */ - -/*************************************************************************/ -/** - * DRM_VMW_CREATE_SURFACE - Create a host suface. - * - * Allocates a device unique surface id, and queues a create surface command - * for the host. Does not wait for host completion. The surface ID can be - * used directly in the command stream and shows up as the same surface - * ID on the host. - */ - -/** - * struct drm_wmv_surface_create_req - * - * @flags: Surface flags as understood by the host. - * @format: Surface format as understood by the host. - * @mip_levels: Number of mip levels for each face. - * An unused face should have 0 encoded. - * @size_addr: Address of a user-space array of sruct drm_vmw_size - * cast to an uint64_t for 32-64 bit compatibility. - * The size of the array should equal the total number of mipmap levels. - * @shareable: Boolean whether other clients (as identified by file descriptors) - * may reference this surface. - * @scanout: Boolean whether the surface is intended to be used as a - * scanout. - * - * Input data to the DRM_VMW_CREATE_SURFACE Ioctl. - * Output data from the DRM_VMW_REF_SURFACE Ioctl. - */ - -struct drm_vmw_surface_create_req { - uint32_t flags; - uint32_t format; - uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES]; - uint64_t size_addr; - int32_t shareable; - int32_t scanout; -}; - -/** - * struct drm_wmv_surface_arg - * - * @sid: Surface id of created surface or surface to destroy or reference. - * - * Output data from the DRM_VMW_CREATE_SURFACE Ioctl. - * Input argument to the DRM_VMW_UNREF_SURFACE Ioctl. - * Input argument to the DRM_VMW_REF_SURFACE Ioctl. - */ - -struct drm_vmw_surface_arg { - int32_t sid; - uint32_t pad64; -}; - -/** - * struct drm_vmw_size ioctl. - * - * @width - mip level width - * @height - mip level height - * @depth - mip level depth - * - * Description of a mip level. - * Input data to the DRM_WMW_CREATE_SURFACE Ioctl. - */ - -struct drm_vmw_size { - uint32_t width; - uint32_t height; - uint32_t depth; - uint32_t pad64; -}; - -/** - * union drm_vmw_surface_create_arg - * - * @rep: Output data as described above. - * @req: Input data as described above. - * - * Argument to the DRM_VMW_CREATE_SURFACE Ioctl. - */ - -union drm_vmw_surface_create_arg { - struct drm_vmw_surface_arg rep; - struct drm_vmw_surface_create_req req; -}; - -/*************************************************************************/ -/** - * DRM_VMW_REF_SURFACE - Reference a host surface. - * - * Puts a reference on a host surface with a give sid, as previously - * returned by the DRM_VMW_CREATE_SURFACE ioctl. - * A reference will make sure the surface isn't destroyed while we hold - * it and will allow the calling client to use the surface ID in the command - * stream. - * - * On successful return, the Ioctl returns the surface information given - * in the DRM_VMW_CREATE_SURFACE ioctl. - */ - -/** - * union drm_vmw_surface_reference_arg - * - * @rep: Output data as described above. - * @req: Input data as described above. - * - * Argument to the DRM_VMW_REF_SURFACE Ioctl. - */ - -union drm_vmw_surface_reference_arg { - struct drm_vmw_surface_create_req rep; - struct drm_vmw_surface_arg req; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_SURFACE - Unreference a host surface. - * - * Clear a reference previously put on a host surface. - * When all references are gone, including the one implicitly placed - * on creation, - * a destroy surface command will be queued for the host. - * Does not wait for completion. - */ - -/*************************************************************************/ -/** - * DRM_VMW_EXECBUF - * - * Submit a command buffer for execution on the host, and return a - * fence sequence that when signaled, indicates that the command buffer has - * executed. - */ - -/** - * struct drm_vmw_execbuf_arg - * - * @commands: User-space address of a command buffer cast to an uint64_t. - * @command-size: Size in bytes of the command buffer. - * @throttle-us: Sleep until software is less than @throttle_us - * microseconds ahead of hardware. The driver may round this value - * to the nearest kernel tick. - * @fence_rep: User-space address of a struct drm_vmw_fence_rep cast to an - * uint64_t. - * @version: Allows expanding the execbuf ioctl parameters without breaking - * backwards compatibility, since user-space will always tell the kernel - * which version it uses. - * @flags: Execbuf flags. None currently. - * - * Argument to the DRM_VMW_EXECBUF Ioctl. - */ - -#define DRM_VMW_EXECBUF_VERSION 0 - -struct drm_vmw_execbuf_arg { - uint64_t commands; - uint32_t command_size; - uint32_t throttle_us; - uint64_t fence_rep; - uint32_t version; - uint32_t flags; -}; - -/** - * struct drm_vmw_fence_rep - * - * @fence_seq: Fence sequence associated with a command submission. - * @error: This member should've been set to -EFAULT on submission. - * The following actions should be take on completion: - * error == -EFAULT: Fence communication failed. The host is synchronized. - * Use the last fence id read from the FIFO fence register. - * error != 0 && error != -EFAULT: - * Fence submission failed. The host is synchronized. Use the fence_seq member. - * error == 0: All is OK, The host may not be synchronized. - * Use the fence_seq member. - * - * Input / Output data to the DRM_VMW_EXECBUF Ioctl. - */ - -struct drm_vmw_fence_rep { - uint64_t fence_seq; - int32_t error; - uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_ALLOC_DMABUF - * - * Allocate a DMA buffer that is visible also to the host. - * NOTE: The buffer is - * identified by a handle and an offset, which are private to the guest, but - * useable in the command stream. The guest kernel may translate these - * and patch up the command stream accordingly. In the future, the offset may - * be zero at all times, or it may disappear from the interface before it is - * fixed. - * - * The DMA buffer may stay user-space mapped in the guest at all times, - * and is thus suitable for sub-allocation. - * - * DMA buffers are mapped using the mmap() syscall on the drm device. - */ - -/** - * struct drm_vmw_alloc_dmabuf_req - * - * @size: Required minimum size of the buffer. - * - * Input data to the DRM_VMW_ALLOC_DMABUF Ioctl. - */ - -struct drm_vmw_alloc_dmabuf_req { - uint32_t size; - uint32_t pad64; -}; - -/** - * struct drm_vmw_dmabuf_rep - * - * @map_handle: Offset to use in the mmap() call used to map the buffer. - * @handle: Handle unique to this buffer. Used for unreferencing. - * @cur_gmr_id: GMR id to use in the command stream when this buffer is - * referenced. See not above. - * @cur_gmr_offset: Offset to use in the command stream when this buffer is - * referenced. See note above. - * - * Output data from the DRM_VMW_ALLOC_DMABUF Ioctl. - */ - -struct drm_vmw_dmabuf_rep { - uint64_t map_handle; - uint32_t handle; - uint32_t cur_gmr_id; - uint32_t cur_gmr_offset; - uint32_t pad64; -}; - -/** - * union drm_vmw_dmabuf_arg - * - * @req: Input data as described above. - * @rep: Output data as described above. - * - * Argument to the DRM_VMW_ALLOC_DMABUF Ioctl. - */ - -union drm_vmw_alloc_dmabuf_arg { - struct drm_vmw_alloc_dmabuf_req req; - struct drm_vmw_dmabuf_rep rep; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_DMABUF - Free a DMA buffer. - * - */ - -/** - * struct drm_vmw_unref_dmabuf_arg - * - * @handle: Handle indicating what buffer to free. Obtained from the - * DRM_VMW_ALLOC_DMABUF Ioctl. - * - * Argument to the DRM_VMW_UNREF_DMABUF Ioctl. - */ - -struct drm_vmw_unref_dmabuf_arg { - uint32_t handle; - uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_FIFO_DEBUG - Get last FIFO submission. - * - * This IOCTL copies the last FIFO submission directly out of the FIFO buffer. - */ - -/** - * struct drm_vmw_fifo_debug_arg - * - * @debug_buffer: User space address of a debug_buffer cast to an uint64_t //In - * @debug_buffer_size: Size in bytes of debug buffer //In - * @used_size: Number of bytes copied to the buffer // Out - * @did_not_fit: Boolean indicating that the fifo contents did not fit. //Out - * - * Argument to the DRM_VMW_FIFO_DEBUG Ioctl. - */ - -struct drm_vmw_fifo_debug_arg { - uint64_t debug_buffer; - uint32_t debug_buffer_size; - uint32_t used_size; - int32_t did_not_fit; - uint32_t pad64; -}; - -struct drm_vmw_fence_wait_arg { - uint64_t sequence; - uint64_t kernel_cookie; - int32_t cookie_valid; - int32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CONTROL_STREAM - Control overlays, aka streams. - * - * This IOCTL controls the overlay units of the svga device. - * The SVGA overlay units does not work like regular hardware units in - * that they do not automaticaly read back the contents of the given dma - * buffer. But instead only read back for each call to this ioctl, and - * at any point between this call being made and a following call that - * either changes the buffer or disables the stream. - */ - -/** - * struct drm_vmw_rect - * - * Defines a rectangle. Used in the overlay ioctl to define - * source and destination rectangle. - */ - -struct drm_vmw_rect { - int32_t x; - int32_t y; - uint32_t w; - uint32_t h; -}; - -/** - * struct drm_vmw_control_stream_arg - * - * @stream_id: Stearm to control - * @enabled: If false all following arguments are ignored. - * @handle: Handle to buffer for getting data from. - * @format: Format of the overlay as understood by the host. - * @width: Width of the overlay. - * @height: Height of the overlay. - * @size: Size of the overlay in bytes. - * @pitch: Array of pitches, the two last are only used for YUV12 formats. - * @offset: Offset from start of dma buffer to overlay. - * @src: Source rect, must be within the defined area above. - * @dst: Destination rect, x and y may be negative. - * - * Argument to the DRM_VMW_CONTROL_STREAM Ioctl. - */ - -struct drm_vmw_control_stream_arg { - uint32_t stream_id; - uint32_t enabled; - - uint32_t flags; - uint32_t color_key; - - uint32_t handle; - uint32_t offset; - int32_t format; - uint32_t size; - uint32_t width; - uint32_t height; - uint32_t pitch[3]; - - uint32_t pad64; - struct drm_vmw_rect src; - struct drm_vmw_rect dst; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CURSOR_BYPASS - Give extra information about cursor bypass. - * - */ - -#define DRM_VMW_CURSOR_BYPASS_ALL (1 << 0) -#define DRM_VMW_CURSOR_BYPASS_FLAGS (1) - -/** - * struct drm_vmw_cursor_bypass_arg - * - * @flags: Flags. - * @crtc_id: Crtc id, only used if DMR_CURSOR_BYPASS_ALL isn't passed. - * @xpos: X position of cursor. - * @ypos: Y position of cursor. - * @xhot: X hotspot. - * @yhot: Y hotspot. - * - * Argument to the DRM_VMW_CURSOR_BYPASS Ioctl. - */ - -struct drm_vmw_cursor_bypass_arg { - uint32_t flags; - uint32_t crtc_id; - int32_t xpos; - int32_t ypos; - int32_t xhot; - int32_t yhot; -}; - -/*************************************************************************/ -/** - * DRM_VMW_CLAIM_STREAM - Claim a single stream. - */ - -/** - * struct drm_vmw_context_arg - * - * @stream_id: Device unique context ID. - * - * Output argument to the DRM_VMW_CREATE_CONTEXT Ioctl. - * Input argument to the DRM_VMW_UNREF_CONTEXT Ioctl. - */ - -struct drm_vmw_stream_arg { - uint32_t stream_id; - uint32_t pad64; -}; - -/*************************************************************************/ -/** - * DRM_VMW_UNREF_STREAM - Unclaim a stream. - * - * Return a single stream that was claimed by this process. Also makes - * sure that the stream has been stopped. - */ - -#endif diff --git a/src/gallium/winsys/drm/vmware/dri/Makefile b/src/gallium/winsys/drm/vmware/dri/Makefile deleted file mode 100644 index 8a39e23da6..0000000000 --- a/src/gallium/winsys/drm/vmware/dri/Makefile +++ /dev/null @@ -1,18 +0,0 @@ - -TOP = ../../../../../.. -include $(TOP)/configs/current - -LIBNAME = vmwgfx_dri.so - -PIPE_DRIVERS = \ - $(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ - $(TOP)/src/gallium/winsys/drm/vmware/core/libsvgadrm.a \ - $(TOP)/src/gallium/drivers/trace/libtrace.a \ - $(TOP)/src/gallium/drivers/svga/libsvga.a - -C_SOURCES = \ - $(COMMON_GALLIUM_SOURCES) - -include ../../Makefile.template - -symlinks: diff --git a/src/gallium/winsys/drm/vmware/dri/SConscript b/src/gallium/winsys/drm/vmware/dri/SConscript deleted file mode 100644 index d26d0cd748..0000000000 --- a/src/gallium/winsys/drm/vmware/dri/SConscript +++ /dev/null @@ -1,63 +0,0 @@ -import os -import os.path - -Import('*') - -if env['platform'] == 'linux': - - if env['dri']: - env = env.Clone() - - sources = [ - '#/src/mesa/drivers/dri/common/utils.c', - '#/src/mesa/drivers/dri/common/vblank.c', - '#/src/mesa/drivers/dri/common/dri_util.c', - '#/src/mesa/drivers/dri/common/xmlconfig.c', - ] - - - env.ParseConfig('pkg-config --cflags --libs libdrm') - - env.Prepend(CPPPATH = [ - '#/src/mesa/state_tracker', - '#/src/mesa/drivers/dri/common', - '#/src/mesa/main', - '#/src/mesa/glapi', - '#/src/mesa', - '#/include', - '#/src/gallium/drivers/svga', - '#/src/gallium/drivers/svga/include', - ]) - - env.Append(CPPDEFINES = [ - 'HAVE_STDINT_H', - 'HAVE_SYS_TYPES_H', - ]) - - env.Append(CFLAGS = [ - '-std=gnu99', - '-D_FILE_OFFSET_BITS=64', - ]) - - env.Prepend(LIBPATH = [ - ]) - - env.Prepend(LIBS = [ - trace, - st_dri, - svgadrm, - svga, - mesa, - glsl, - gallium, - ]) - - # TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions - env.LoadableModule( - target ='vmwgfx_dri.so', - source = sources, - LIBS = env['LIBS'], - SHLIBPREFIX = '', - ) - - diff --git a/src/gallium/winsys/drm/vmware/egl/Makefile b/src/gallium/winsys/drm/vmware/egl/Makefile deleted file mode 100644 index a3e73131c3..0000000000 --- a/src/gallium/winsys/drm/vmware/egl/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -TOP = ../../../../../.. -include $(TOP)/configs/current - -EGL_DRIVER_NAME = vmwgfx -EGL_DRIVER_SOURCES = dummy.c -EGL_DRIVER_LIBS = - -EGL_DRIVER_PIPES = \ - $(TOP)/src/gallium/winsys/drm/vmware/core/libsvgadrm.a \ - $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ - $(TOP)/src/gallium/drivers/trace/libtrace.a \ - $(TOP)/src/gallium/drivers/svga/libsvga.a - -include ../../Makefile.egl diff --git a/src/gallium/winsys/drm/vmware/egl/dummy.c b/src/gallium/winsys/drm/vmware/egl/dummy.c deleted file mode 100644 index 3181d0ba7e..0000000000 --- a/src/gallium/winsys/drm/vmware/egl/dummy.c +++ /dev/null @@ -1,3 +0,0 @@ -/* A poor man's --whole-archive for EGL drivers */ -void *_eglMain(void *); -void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/winsys/drm/vmware/xorg/Makefile b/src/gallium/winsys/drm/vmware/xorg/Makefile deleted file mode 100644 index 49e28ae17f..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -TOP = ../../../../../.. - -include $(TOP)/configs/current - -TARGET = vmwgfx_drv.so - -CFILES = \ - vmw_xorg.c \ - vmw_video.c \ - vmw_ioctl.c \ - vmw_screen.c - -OBJECTS = $(patsubst %.c,%.o,$(CFILES)) - -INCLUDES = \ - $(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \ - -I$(TOP)/src/gallium/include \ - -I$(TOP)/src/gallium/drivers \ - -I$(TOP)/src/gallium/auxiliary \ - -I$(TOP)/src/gallium - -LIBS = \ - $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ - $(TOP)/src/gallium/winsys/drm/vmware/core/libsvgadrm.a \ - $(TOP)/src/gallium/drivers/trace/libtrace.a \ - $(TOP)/src/gallium/drivers/svga/libsvga.a \ - $(GALLIUM_AUXILIARIES) - -LINKS = \ - $(shell pkg-config --libs --silence-errors libkms) \ - $(shell pkg-config --libs libdrm) - -DRIVER_DEFINES = \ - -std=gnu99 \ - -DHAVE_CONFIG_H - -TARGET_STAGING = $(TOP)/$(LIB_DIR)/gallium/$(TARGET) - -############################################# - - - -all default: $(TARGET) $(TARGET_STAGING) - -$(TARGET): $(OBJECTS) Makefile $(LIBS) - $(MKLIB) -noprefix -o $@ $(OBJECTS) $(LIBS) $(LINKS) - -$(TOP)/$(LIB_DIR)/gallium: - mkdir -p $@ - -$(TARGET_STAGING): $(TARGET) $(TOP)/$(LIB_DIR)/gallium - $(INSTALL) $(TARGET) $(TOP)/$(LIB_DIR)/gallium - -clean: - rm -rf $(OBJECTS) $(TARGET) - -install: - $(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) - $(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) - - -############################################## - - -.c.o: - $(CC) -c $(CFLAGS) $(INCLUDES) $(DRIVER_DEFINES) $< -o $@ - - -############################################## - -.PHONY = all clean install diff --git a/src/gallium/winsys/drm/vmware/xorg/SConscript b/src/gallium/winsys/drm/vmware/xorg/SConscript deleted file mode 100644 index 1e5d8ff7fe..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/SConscript +++ /dev/null @@ -1,57 +0,0 @@ -import os.path - -Import('*') - -if env['platform'] == 'linux': - - env = env.Clone() - - env.ParseConfig('pkg-config --cflags --libs libdrm xorg-server') - - env.Prepend(CPPPATH = [ - '#/include', - '#/src/gallium', - '#/src/mesa', - '#/src/gallium/drivers/svga', - '#/src/gallium/drivers/svga/include', - ]) - - env.Append(CPPDEFINES = [ - ]) - - if env['gcc']: - env.Append(CPPDEFINES = [ - 'HAVE_STDINT_H', - 'HAVE_SYS_TYPES_H', - ]) - - env.Append(CFLAGS = [ - '-std=gnu99', - '-D_FILE_OFFSET_BITS=64', - ]) - - env.Prepend(LIBPATH = [ - ]) - - env.Prepend(LIBS = [ - trace, - st_xorg, - svgadrm, - svga, - gallium, - ]) - - sources = [ - 'vmw_ioctl.c', - 'vmw_screen.c', - 'vmw_video.c', - 'vmw_xorg.c', - ] - - # TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions - env.LoadableModule( - target ='vmwgfx_drv.so', - source = sources, - LIBS = env['LIBS'], - SHLIBPREFIX = '', - ) diff --git a/src/gallium/winsys/drm/vmware/xorg/vmw_driver.h b/src/gallium/winsys/drm/vmware/xorg/vmw_driver.h deleted file mode 100644 index ba754b51e4..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/vmw_driver.h +++ /dev/null @@ -1,103 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * Contains the shared resources for VMware Xorg driver - * that sits ontop of the Xorg State Traker. - * - * It is initialized in vmw_screen.c. - * - * @author Jakob Bornecrantz <jakob@vmware.com> - */ - -#ifndef VMW_DRIVER_H_ -#define VMW_DRIVER_H_ - -#include "state_trackers/xorg/xorg_tracker.h" - -struct vmw_dma_buffer; - -struct vmw_customizer -{ - CustomizerRec base; - ScrnInfoPtr pScrn; - - int fd; - - void *cursor_priv; - - /* vmw_video.c */ - void *video_priv; -}; - -static INLINE struct vmw_customizer * -vmw_customizer(CustomizerPtr cust) -{ - return cust ? (struct vmw_customizer *) cust : NULL; -} - - -/*********************************************************************** - * vmw_video.c - */ - -Bool vmw_video_init(struct vmw_customizer *vmw); - -Bool vmw_video_close(struct vmw_customizer *vmw); - -void vmw_video_stop_all(struct vmw_customizer *vmw); - - -/*********************************************************************** - * vmw_ioctl.c - */ - -int vmw_ioctl_cursor_bypass(struct vmw_customizer *vmw, int xhot, int yhot); - -struct vmw_dma_buffer * vmw_ioctl_buffer_create(struct vmw_customizer *vmw, - uint32_t size, - unsigned *handle); - -void * vmw_ioctl_buffer_map(struct vmw_customizer *vmw, - struct vmw_dma_buffer *buf); - -void vmw_ioctl_buffer_unmap(struct vmw_customizer *vmw, - struct vmw_dma_buffer *buf); - -void vmw_ioctl_buffer_destroy(struct vmw_customizer *vmw, - struct vmw_dma_buffer *buf); - -int vmw_ioctl_supports_streams(struct vmw_customizer *vmw); - -int vmw_ioctl_num_streams(struct vmw_customizer *vmw, - uint32_t *ntot, uint32_t *nfree); - -int vmw_ioctl_unref_stream(struct vmw_customizer *vmw, uint32_t stream_id); - -int vmw_ioctl_claim_stream(struct vmw_customizer *vmw, uint32_t *out); - - -#endif diff --git a/src/gallium/winsys/drm/vmware/xorg/vmw_hook.h b/src/gallium/winsys/drm/vmware/xorg/vmw_hook.h deleted file mode 100644 index 224a2d9299..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/vmw_hook.h +++ /dev/null @@ -1,39 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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 VMW_HOOK_H_ -#define VMW_HOOK_H_ - -#include "state_trackers/xorg/xorg_winsys.h" - - -/*********************************************************************** - * vmw_screen.c - */ - -void vmw_screen_set_functions(ScrnInfoPtr pScrn); - - -#endif diff --git a/src/gallium/winsys/drm/vmware/xorg/vmw_ioctl.c b/src/gallium/winsys/drm/vmware/xorg/vmw_ioctl.c deleted file mode 100644 index 521578ab35..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/vmw_ioctl.c +++ /dev/null @@ -1,242 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * Contains the functions for creating dma buffers by calling - * the kernel via driver specific ioctls. - * - * @author Jakob Bornecrantz <jakob@vmware.com> - */ - -#ifndef HAVE_STDINT_H -#define HAVE_STDINT_H 1 -#endif -#define _FILE_OFFSET_BITS 64 - -#include <errno.h> -#include <stdlib.h> -#include <string.h> - -#include <sys/mman.h> -#include "xf86drm.h" -#include "../core/vmwgfx_drm.h" - -#include "vmw_driver.h" -#include "util/u_debug.h" - -struct vmw_dma_buffer -{ - void *data; - unsigned handle; - uint64_t map_handle; - unsigned map_count; - uint32_t size; -}; - -static int -vmw_ioctl_get_param(struct vmw_customizer *vmw, uint32_t param, uint64_t *out) -{ - struct drm_vmw_getparam_arg gp_arg; - int ret; - - memset(&gp_arg, 0, sizeof(gp_arg)); - gp_arg.param = param; - ret = drmCommandWriteRead(vmw->fd, DRM_VMW_GET_PARAM, - &gp_arg, sizeof(gp_arg)); - - if (ret == 0) { - *out = gp_arg.value; - } - - return ret; -} - -int -vmw_ioctl_supports_streams(struct vmw_customizer *vmw) -{ - uint64_t value; - int ret; - - ret = vmw_ioctl_get_param(vmw, DRM_VMW_PARAM_NUM_STREAMS, &value); - if (ret) - return ret; - - return value ? 0 : -ENOSYS; -} - -int -vmw_ioctl_num_streams(struct vmw_customizer *vmw, - uint32_t *ntot, uint32_t *nfree) -{ - uint64_t v1, v2; - int ret; - - ret = vmw_ioctl_get_param(vmw, DRM_VMW_PARAM_NUM_STREAMS, &v1); - if (ret) - return ret; - - ret = vmw_ioctl_get_param(vmw, DRM_VMW_PARAM_NUM_FREE_STREAMS, &v2); - if (ret) - return ret; - - *ntot = (uint32_t)v1; - *nfree = (uint32_t)v2; - - return 0; -} - -int -vmw_ioctl_claim_stream(struct vmw_customizer *vmw, uint32_t *out) -{ - struct drm_vmw_stream_arg s_arg; - int ret; - - ret = drmCommandRead(vmw->fd, DRM_VMW_CLAIM_STREAM, - &s_arg, sizeof(s_arg)); - - if (ret) - return -1; - - *out = s_arg.stream_id; - return 0; -} - -int -vmw_ioctl_unref_stream(struct vmw_customizer *vmw, uint32_t stream_id) -{ - struct drm_vmw_stream_arg s_arg; - int ret; - - memset(&s_arg, 0, sizeof(s_arg)); - s_arg.stream_id = stream_id; - - ret = drmCommandRead(vmw->fd, DRM_VMW_CLAIM_STREAM, - &s_arg, sizeof(s_arg)); - - return 0; -} - -int -vmw_ioctl_cursor_bypass(struct vmw_customizer *vmw, int xhot, int yhot) -{ - struct drm_vmw_cursor_bypass_arg arg; - int ret; - - memset(&arg, 0, sizeof(arg)); - arg.flags = DRM_VMW_CURSOR_BYPASS_ALL; - arg.xhot = xhot; - arg.yhot = yhot; - - ret = drmCommandWrite(vmw->fd, DRM_VMW_CURSOR_BYPASS, - &arg, sizeof(arg)); - - return ret; -} - -struct vmw_dma_buffer * -vmw_ioctl_buffer_create(struct vmw_customizer *vmw, uint32_t size, unsigned *handle) -{ - struct vmw_dma_buffer *buf; - union drm_vmw_alloc_dmabuf_arg arg; - struct drm_vmw_alloc_dmabuf_req *req = &arg.req; - struct drm_vmw_dmabuf_rep *rep = &arg.rep; - int ret; - - buf = xcalloc(1, sizeof(*buf)); - if (!buf) - goto err; - - memset(&arg, 0, sizeof(arg)); - req->size = size; - do { - ret = drmCommandWriteRead(vmw->fd, DRM_VMW_ALLOC_DMABUF, &arg, sizeof(arg)); - } while (ret == -ERESTART); - - if (ret) { - debug_printf("IOCTL failed %d: %s\n", ret, strerror(-ret)); - goto err_free; - } - - - buf->data = NULL; - buf->handle = rep->handle; - buf->map_handle = rep->map_handle; - buf->map_count = 0; - buf->size = size; - - *handle = rep->handle; - - return buf; - -err_free: - xfree(buf); -err: - return NULL; -} - -void -vmw_ioctl_buffer_destroy(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf) -{ - struct drm_vmw_unref_dmabuf_arg arg; - - if (buf->data) { - munmap(buf->data, buf->size); - buf->data = NULL; - } - - memset(&arg, 0, sizeof(arg)); - arg.handle = buf->handle; - drmCommandWrite(vmw->fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg)); - - xfree(buf); -} - -void * -vmw_ioctl_buffer_map(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf) -{ - void *map; - - if (buf->data == NULL) { - map = mmap(NULL, buf->size, PROT_READ | PROT_WRITE, MAP_SHARED, - vmw->fd, buf->map_handle); - if (map == MAP_FAILED) { - debug_printf("%s: Map failed.\n", __FUNCTION__); - return NULL; - } - - buf->data = map; - } - - ++buf->map_count; - - return buf->data; -} - -void -vmw_ioctl_buffer_unmap(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf) -{ - --buf->map_count; -} diff --git a/src/gallium/winsys/drm/vmware/xorg/vmw_screen.c b/src/gallium/winsys/drm/vmware/xorg/vmw_screen.c deleted file mode 100644 index f43f91e5c0..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/vmw_screen.c +++ /dev/null @@ -1,178 +0,0 @@ -/********************************************************** - * 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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * Contains the init code for the VMware Xorg driver. - * - * @author Jakob Bornecrantz <jakob@vmware.com> - */ - -#include "vmw_hook.h" -#include "vmw_driver.h" - -#include "cursorstr.h" - -/* modified version of crtc functions */ -xf86CrtcFuncsRec vmw_screen_crtc_funcs; - -static void -vmw_screen_cursor_load_argb(xf86CrtcPtr crtc, CARD32 *image) -{ - struct vmw_customizer *vmw = - vmw_customizer(xorg_customizer(crtc->scrn)); - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - xf86CrtcFuncsPtr funcs = vmw->cursor_priv; - CursorPtr c = config->cursor; - - /* Run the ioctl before uploading the image */ - vmw_ioctl_cursor_bypass(vmw, c->bits->xhot, c->bits->yhot); - - funcs->load_cursor_argb(crtc, image); -} - -static void -vmw_screen_cursor_init(struct vmw_customizer *vmw) -{ - ScrnInfoPtr pScrn = vmw->pScrn; - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); - int i; - - /* XXX assume that all crtc's have the same function struct */ - - /* Save old struct need to call the old functions as well */ - vmw->cursor_priv = (void*)(config->crtc[0]->funcs); - memcpy(&vmw_screen_crtc_funcs, vmw->cursor_priv, sizeof(xf86CrtcFuncsRec)); - vmw_screen_crtc_funcs.load_cursor_argb = vmw_screen_cursor_load_argb; - - for (i = 0; i < config->num_crtc; i++) - config->crtc[i]->funcs = &vmw_screen_crtc_funcs; -} - -static void -vmw_screen_cursor_close(struct vmw_customizer *vmw) -{ - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(vmw->pScrn); - int i; - - vmw_ioctl_cursor_bypass(vmw, 0, 0); - - for (i = 0; i < config->num_crtc; i++) - config->crtc[i]->funcs = vmw->cursor_priv; -} - -static Bool -vmw_screen_init(CustomizerPtr cust, int fd) -{ - struct vmw_customizer *vmw = vmw_customizer(cust); - - vmw->fd = fd; - vmw_screen_cursor_init(vmw); - - /* if gallium is used then we don't need to do anything more. */ - if (xorg_has_gallium(vmw->pScrn)) - return TRUE; - - vmw_video_init(vmw); - - return TRUE; -} - -static Bool -vmw_screen_close(CustomizerPtr cust) -{ - struct vmw_customizer *vmw = vmw_customizer(cust); - - if (!vmw) - return TRUE; - - vmw_screen_cursor_close(vmw); - - vmw_video_close(vmw); - - return TRUE; -} - -static Bool -vmw_screen_enter_vt(CustomizerPtr cust) -{ - debug_printf("%s: enter\n", __func__); - - return TRUE; -} - -static Bool -vmw_screen_leave_vt(CustomizerPtr cust) -{ - struct vmw_customizer *vmw = vmw_customizer(cust); - - debug_printf("%s: enter\n", __func__); - - vmw_video_stop_all(vmw); - - return TRUE; -} - -/* - * Functions for setting up hooks into the xorg state tracker - */ - -static Bool (*vmw_screen_pre_init_saved)(ScrnInfoPtr pScrn, int flags) = NULL; - -static Bool -vmw_screen_pre_init(ScrnInfoPtr pScrn, int flags) -{ - struct vmw_customizer *vmw; - CustomizerPtr cust; - - vmw = xnfcalloc(1, sizeof(*vmw)); - if (!vmw) - return FALSE; - - cust = &vmw->base; - - cust->winsys_screen_init = vmw_screen_init; - cust->winsys_screen_close = vmw_screen_close; - cust->winsys_enter_vt = vmw_screen_enter_vt; - cust->winsys_leave_vt = vmw_screen_leave_vt; - vmw->pScrn = pScrn; - - pScrn->driverPrivate = cust; - - pScrn->PreInit = vmw_screen_pre_init_saved; - if (!pScrn->PreInit(pScrn, flags)) - return FALSE; - - return TRUE; -} - -void -vmw_screen_set_functions(ScrnInfoPtr pScrn) -{ - assert(!vmw_screen_pre_init_saved); - - vmw_screen_pre_init_saved = pScrn->PreInit; - pScrn->PreInit = vmw_screen_pre_init; -} diff --git a/src/gallium/winsys/drm/vmware/xorg/vmw_video.c b/src/gallium/winsys/drm/vmware/xorg/vmw_video.c deleted file mode 100644 index de28f06a47..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/vmw_video.c +++ /dev/null @@ -1,1072 +0,0 @@ -/* - * Copyright 2007 by VMware, 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 - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. - * - * Except as contained in this notice, the name of the copyright holder(s) - * and author(s) shall not be used in advertising or otherwise to promote - * the sale, use or other dealings in this Software without prior written - * authorization from the copyright holder(s) and author(s). - */ - -/* - * vmwarevideo.c -- - * - * Xv extension support. - * See http://www.xfree86.org/current/DESIGN16.html - * - */ - - -#include "xf86xv.h" -#include "fourcc.h" - -#include "pipe/p_compiler.h" -/* - * We can't incude svga_types.h due to conflicting types for Bool. - */ -typedef int64_t int64; -typedef uint64_t uint64; - -typedef int32_t int32; -typedef uint32_t uint32; - -typedef int16_t int16; -typedef uint16_t uint16; - -typedef int8_t int8; -typedef uint8_t uint8; - -#include "svga/include/svga_reg.h" -#include "svga/include/svga_escape.h" -#include "svga/include/svga_overlay.h" - -#include "vmw_driver.h" - -#include <X11/extensions/Xv.h> - -#include "xf86drm.h" -#include "../core/vmwgfx_drm.h" - -#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) - -/* - * Number of videos that can be played simultaneously - */ -#define VMWARE_VID_NUM_PORTS 1 - -/* - * Using a dark shade as the default colorKey - */ -#define VMWARE_VIDEO_COLORKEY 0x100701 - -/* - * Maximum dimensions - */ -#define VMWARE_VID_MAX_WIDTH 2048 -#define VMWARE_VID_MAX_HEIGHT 2048 - -#define VMWARE_VID_NUM_ENCODINGS 1 -static XF86VideoEncodingRec vmwareVideoEncodings[] = -{ - { - 0, - "XV_IMAGE", - VMWARE_VID_MAX_WIDTH, VMWARE_VID_MAX_HEIGHT, - {1, 1} - } -}; - -#define VMWARE_VID_NUM_FORMATS 2 -static XF86VideoFormatRec vmwareVideoFormats[] = -{ - { 16, TrueColor}, - { 24, TrueColor} -}; - -#define VMWARE_VID_NUM_IMAGES 3 -static XF86ImageRec vmwareVideoImages[] = -{ - XVIMAGE_YV12, - XVIMAGE_YUY2, - XVIMAGE_UYVY -}; - -#define VMWARE_VID_NUM_ATTRIBUTES 2 -static XF86AttributeRec vmwareVideoAttributes[] = -{ - { - XvGettable | XvSettable, - 0x000000, - 0xffffff, - "XV_COLORKEY" - }, - { - XvGettable | XvSettable, - 0, - 1, - "XV_AUTOPAINT_COLORKEY" - } -}; - -/* - * Video frames are stored in a circular list of buffers. - * Must be power or two, See vmw_video_port_play. - */ -#define VMWARE_VID_NUM_BUFFERS 1 - -/* - * Defines the structure used to hold and pass video data to the host - */ -struct vmw_video_buffer -{ - unsigned handle; - int size; - void *data; - void *extra_data; - struct vmw_dma_buffer *buf; -}; - - -/** - * Structure representing a single video stream, aka port. - * - * Ports maps one to one to a SVGA stream. Port is just - * what Xv calls a SVGA stream. - */ -struct vmw_video_port -{ - /* - * Function prototype same as XvPutImage. - * - * This is either set to vmw_video_port_init or vmw_video_port_play. - * At init this function is set to port_init. In port_init we set it - * to port_play and call it, after initializing the struct. - */ - int (*play)(ScrnInfoPtr, struct vmw_video_port *, - short, short, short, short, short, - short, short, short, int, unsigned char*, - short, short, RegionPtr); - - /* values to go into the SVGAOverlayUnit */ - uint32 streamId; - uint32 colorKey; - uint32 flags; - - /* round robin of buffers */ - unsigned currBuf; - struct vmw_video_buffer bufs[VMWARE_VID_NUM_BUFFERS]; - - /* properties that applies to all buffers */ - int size; - int pitches[3]; - int offsets[3]; - - /* things for X */ - RegionRec clipBoxes; - Bool isAutoPaintColorkey; -}; - - -/** - * Structure holding all the infromation for video. - */ -struct vmw_video_private -{ - int fd; - - /** ports */ - struct vmw_video_port port[VMWARE_VID_NUM_PORTS]; - - /** Used to store port pointers pointers */ - DevUnion port_ptr[VMWARE_VID_NUM_PORTS]; -}; - - -/* - * Callback functions exported to Xv, prefixed with vmw_xv_*. - */ -static int vmw_xv_put_image(ScrnInfoPtr pScrn, short src_x, short src_y, - short drw_x, short drw_y, short src_w, short src_h, - short drw_w, short drw_h, int image, - unsigned char *buf, short width, short height, - Bool sync, RegionPtr clipBoxes, pointer data, - DrawablePtr dst); -static void vmw_xv_stop_video(ScrnInfoPtr pScrn, pointer data, Bool Cleanup); -static int vmw_xv_query_image_attributes(ScrnInfoPtr pScrn, int format, - unsigned short *width, - unsigned short *height, int *pitches, - int *offsets); -static int vmw_xv_set_port_attribute(ScrnInfoPtr pScrn, Atom attribute, - INT32 value, pointer data); -static int vmw_xv_get_port_attribute(ScrnInfoPtr pScrn, Atom attribute, - INT32 *value, pointer data); -static void vmw_xv_query_best_size(ScrnInfoPtr pScrn, Bool motion, - short vid_w, short vid_h, short drw_w, - short drw_h, unsigned int *p_w, - unsigned int *p_h, pointer data); - - -/* - * Local functions. - */ -static XF86VideoAdaptorPtr vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw); - -static int vmw_video_port_init(ScrnInfoPtr pScrn, - struct vmw_video_port *port, - short src_x, short src_y, short drw_x, - short drw_y, short src_w, short src_h, - short drw_w, short drw_h, int format, - unsigned char *buf, short width, - short height, RegionPtr clipBoxes); -static int vmw_video_port_play(ScrnInfoPtr pScrn, struct vmw_video_port *port, - short src_x, short src_y, short drw_x, - short drw_y, short src_w, short src_h, - short drw_w, short drw_h, int format, - unsigned char *buf, short width, - short height, RegionPtr clipBoxes); -static void vmw_video_port_cleanup(ScrnInfoPtr pScrn, struct vmw_video_port *port); - -static int vmw_video_buffer_alloc(struct vmw_customizer *vmw, int size, - struct vmw_video_buffer *out); -static int vmw_video_buffer_free(struct vmw_customizer *vmw, - struct vmw_video_buffer *out); - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_init -- - * - * Initializes Xv support. - * - * Results: - * TRUE on success, FALSE on error. - * - * Side effects: - * Xv support is initialized. Memory is allocated for all supported - * video streams. - * - *----------------------------------------------------------------------------- - */ - -Bool -vmw_video_init(struct vmw_customizer *vmw) -{ - ScrnInfoPtr pScrn = vmw->pScrn; - ScreenPtr pScreen = pScrn->pScreen; - XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL; - XF86VideoAdaptorPtr newAdaptor = NULL; - int numAdaptors; - unsigned int ntot, nfree; - - debug_printf("%s: enter\n", __func__); - - if (vmw_ioctl_num_streams(vmw, &ntot, &nfree) != 0) { - debug_printf("No stream ioctl support\n"); - return FALSE; - } - - if (nfree == 0) { - debug_printf("No free streams\n"); - return FALSE; - } - - numAdaptors = xf86XVListGenericAdaptors(pScrn, &overlayAdaptors); - - newAdaptor = vmw_video_init_adaptor(pScrn, vmw); - if (!newAdaptor) { - debug_printf("Failed to initialize Xv extension\n"); - return FALSE; - } - - if (!numAdaptors) { - numAdaptors = 1; - overlayAdaptors = &newAdaptor; - } else { - newAdaptors = xalloc((numAdaptors + 1) * - sizeof(XF86VideoAdaptorPtr*)); - if (!newAdaptors) { - xf86XVFreeVideoAdaptorRec(newAdaptor); - return FALSE; - } - - memcpy(newAdaptors, overlayAdaptors, - numAdaptors * sizeof(XF86VideoAdaptorPtr)); - newAdaptors[numAdaptors++] = newAdaptor; - overlayAdaptors = newAdaptors; - } - - if (!xf86XVScreenInit(pScreen, overlayAdaptors, numAdaptors)) { - debug_printf("Failed to initialize Xv extension\n"); - xf86XVFreeVideoAdaptorRec(newAdaptor); - return FALSE; - } - - if (newAdaptors) { - xfree(newAdaptors); - } - - debug_printf("Initialized VMware Xv extension successfully\n"); - - return TRUE; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_close -- - * - * Unitializes video. - * - * Results: - * TRUE. - * - * Side effects: - * vmw->video_priv = NULL - * - *----------------------------------------------------------------------------- - */ - -Bool -vmw_video_close(struct vmw_customizer *vmw) -{ - ScrnInfoPtr pScrn = vmw->pScrn; - struct vmw_video_private *video; - int i; - - debug_printf("%s: enter\n", __func__); - - video = vmw->video_priv; - if (!video) - return TRUE; - - for (i = 0; i < VMWARE_VID_NUM_PORTS; ++i) { - /* make sure the port is stoped as well */ - vmw_xv_stop_video(pScrn, &video->port[i], TRUE); - vmw_ioctl_unref_stream(vmw, video->port[i].streamId); - } - - /* XXX: I'm sure this function is missing code for turning off Xv */ - - free(vmw->video_priv); - vmw->video_priv = NULL; - - return TRUE; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_stop_all -- - * - * Stop all video streams from playing. - * - * Results: - * None. - * - * Side effects: - * All buffers are freed. - * - *----------------------------------------------------------------------------- - */ - -void vmw_video_stop_all(struct vmw_customizer *vmw) -{ - ScrnInfoPtr pScrn = vmw->pScrn; - struct vmw_video_private *video = vmw->video_priv; - int i; - - debug_printf("%s: enter\n", __func__); - - if (!video) - return; - - for (i = 0; i < VMWARE_VID_NUM_PORTS; ++i) { - vmw_xv_stop_video(pScrn, &video->port[i], TRUE); - } -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_init_adaptor -- - * - * Initializes a XF86VideoAdaptor structure with the capabilities and - * functions supported by this video driver. - * - * Results: - * On success initialized XF86VideoAdaptor struct or NULL on error - * - * Side effects: - * None. - * - *----------------------------------------------------------------------------- - */ - -static XF86VideoAdaptorPtr -vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw) -{ - XF86VideoAdaptorPtr adaptor; - struct vmw_video_private *video; - int i; - - debug_printf("%s: enter \n", __func__); - - adaptor = xf86XVAllocateVideoAdaptorRec(pScrn); - if (!adaptor) { - debug_printf("Not enough memory\n"); - return NULL; - } - - video = xcalloc(1, sizeof(*video)); - if (!video) { - debug_printf("Not enough memory.\n"); - xf86XVFreeVideoAdaptorRec(adaptor); - return NULL; - } - - vmw->video_priv = video; - - adaptor->type = XvInputMask | XvImageMask | XvWindowMask; - adaptor->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; - adaptor->name = "VMware Video Engine"; - adaptor->nEncodings = VMWARE_VID_NUM_ENCODINGS; - adaptor->pEncodings = vmwareVideoEncodings; - adaptor->nFormats = VMWARE_VID_NUM_FORMATS; - adaptor->pFormats = vmwareVideoFormats; - adaptor->nPorts = VMWARE_VID_NUM_PORTS; - adaptor->pPortPrivates = video->port_ptr; - - for (i = 0; i < VMWARE_VID_NUM_PORTS; ++i) { - vmw_ioctl_claim_stream(vmw, &video->port[i].streamId); - video->port[i].play = vmw_video_port_init; - video->port[i].flags = SVGA_VIDEO_FLAG_COLORKEY; - video->port[i].colorKey = VMWARE_VIDEO_COLORKEY; - video->port[i].isAutoPaintColorkey = TRUE; - adaptor->pPortPrivates[i].ptr = &video->port[i]; - } - - adaptor->nAttributes = VMWARE_VID_NUM_ATTRIBUTES; - adaptor->pAttributes = vmwareVideoAttributes; - - adaptor->nImages = VMWARE_VID_NUM_IMAGES; - adaptor->pImages = vmwareVideoImages; - - adaptor->PutVideo = NULL; - adaptor->PutStill = NULL; - adaptor->GetVideo = NULL; - adaptor->GetStill = NULL; - adaptor->StopVideo = vmw_xv_stop_video; - adaptor->SetPortAttribute = vmw_xv_set_port_attribute; - adaptor->GetPortAttribute = vmw_xv_get_port_attribute; - adaptor->QueryBestSize = vmw_xv_query_best_size; - adaptor->PutImage = vmw_xv_put_image; - adaptor->QueryImageAttributes = vmw_xv_query_image_attributes; - - debug_printf("%s: done %p\n", __func__, adaptor); - - return adaptor; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_port_init -- - * - * Initializes a video stream in response to the first PutImage() on a - * video stream. The process goes as follows: - * - Figure out characteristics according to format - * - Allocate offscreen memory - * - Pass on video to Play() functions - * - * Results: - * Success or XvBadAlloc on failure. - * - * Side effects: - * Video stream is initialized and its first frame sent to the host - * (done by VideoPlay() function called at the end) - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_video_port_init(ScrnInfoPtr pScrn, struct vmw_video_port *port, - short src_x, short src_y, short drw_x, - short drw_y, short src_w, short src_h, - short drw_w, short drw_h, int format, - unsigned char *buf, short width, - short height, RegionPtr clipBoxes) -{ - struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); - unsigned short w, h; - int i, ret; - - debug_printf("\t%s: id %d, format %d\n", __func__, port->streamId, format); - - w = width; - h = height; - /* init all the format attributes, used for buffers */ - port->size = vmw_xv_query_image_attributes(pScrn, format, &w, &h, - port->pitches, port->offsets); - - if (port->size == -1) - return XvBadAlloc; - - port->play = vmw_video_port_play; - - for (i = 0; i < VMWARE_VID_NUM_BUFFERS; ++i) { - ret = vmw_video_buffer_alloc(vmw, port->size, &port->bufs[i]); - if (ret != Success) - break; - } - - /* Free all allocated buffers on failure */ - if (ret != Success) { - for (--i; i >= 0; --i) { - vmw_video_buffer_free(vmw, &port->bufs[i]); - } - return ret; - } - - port->currBuf = 0; - - REGION_COPY(pScrn->pScreen, &port->clipBoxes, clipBoxes); - - if (port->isAutoPaintColorkey) - xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes); - - return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, src_h, - drw_w, drw_h, format, buf, width, height, clipBoxes); -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_port_play -- - * - * Sends all the attributes associated with the video frame using the - * FIFO ESCAPE mechanism to the host. - * - * Results: - * Always returns Success. - * - * Side effects: - * None. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_video_port_play(ScrnInfoPtr pScrn, struct vmw_video_port *port, - short src_x, short src_y, short drw_x, - short drw_y, short src_w, short src_h, - short drw_w, short drw_h, int format, - unsigned char *buf, short width, - short height, RegionPtr clipBoxes) -{ - struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); - struct drm_vmw_control_stream_arg arg; - unsigned short w, h; - int size; - int ret; - - debug_printf("\t%s: enter\n", __func__); - - w = width; - h = height; - - /* we don't update the ports size */ - size = vmw_xv_query_image_attributes(pScrn, format, &w, &h, - port->pitches, port->offsets); - - if (size > port->size) { - debug_printf("\t%s: Increase in size of Xv video frame streamId:%d.\n", - __func__, port->streamId); - vmw_xv_stop_video(pScrn, port, TRUE); - return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, - src_h, drw_w, drw_h, format, buf, width, height, - clipBoxes); - } - - memcpy(port->bufs[port->currBuf].data, buf, port->size); - - memset(&arg, 0, sizeof(arg)); - - arg.stream_id = port->streamId; - arg.enabled = TRUE; - arg.flags = port->flags; - arg.color_key = port->colorKey; - arg.handle = port->bufs[port->currBuf].handle; - arg.format = format; - arg.size = port->size; - arg.width = w; - arg.height = h; - arg.src.x = src_x; - arg.src.y = src_y; - arg.src.w = src_w; - arg.src.h = src_h; - arg.dst.x = drw_x; - arg.dst.y = drw_y; - arg.dst.w = drw_w; - arg.dst.h = drw_h; - arg.pitch[0] = port->pitches[0]; - arg.pitch[1] = port->pitches[1]; - arg.pitch[2] = port->pitches[2]; - arg.offset = 0; - - /* - * Update the clipList and paint the colorkey, if required. - */ - if (!REGION_EQUAL(pScrn->pScreen, &port->clipBoxes, clipBoxes)) { - REGION_COPY(pScrn->pScreen, &port->clipBoxes, clipBoxes); - if (port->isAutoPaintColorkey) { - xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes); - } - } - - ret = drmCommandWrite(vmw->fd, DRM_VMW_CONTROL_STREAM, &arg, sizeof(arg)); - if (ret) { - vmw_video_port_cleanup(pScrn, port); - return XvBadAlloc; - } - - if (++(port->currBuf) >= VMWARE_VID_NUM_BUFFERS) - port->currBuf = 0; - - return Success; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_port_cleanup -- - * - * Frees up all resources (if any) taken by a video stream. - * - * Results: - * None. - * - * Side effects: - * Same as above. - * - *----------------------------------------------------------------------------- - */ - -static void -vmw_video_port_cleanup(ScrnInfoPtr pScrn, struct vmw_video_port *port) -{ - struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); - uint32 id, colorKey, flags; - Bool isAutoPaintColorkey; - int i; - - debug_printf("\t%s: enter\n", __func__); - - for (i = 0; i < VMWARE_VID_NUM_BUFFERS; i++) { - vmw_video_buffer_free(vmw, &port->bufs[i]); - } - - /* - * reset stream for next video - */ - id = port->streamId; - colorKey = port->colorKey; - flags = port->flags; - isAutoPaintColorkey = port->isAutoPaintColorkey; - - memset(port, 0, sizeof(*port)); - - port->streamId = id; - port->play = vmw_video_port_init; - port->colorKey = colorKey; - port->flags = flags; - port->isAutoPaintColorkey = isAutoPaintColorkey; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_buffer_alloc -- - * - * Allocates and map a kernel buffer to be used as data storage. - * - * Results: - * XvBadAlloc on failure, otherwise Success. - * - * Side effects: - * Calls into the kernel, sets members of out. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_video_buffer_alloc(struct vmw_customizer *vmw, int size, - struct vmw_video_buffer *out) -{ - out->buf = vmw_ioctl_buffer_create(vmw, size, &out->handle); - if (!out->buf) - return XvBadAlloc; - - out->data = vmw_ioctl_buffer_map(vmw, out->buf); - if (!out->data) { - vmw_ioctl_buffer_destroy(vmw, out->buf); - - out->handle = 0; - out->buf = NULL; - - return XvBadAlloc; - } - - out->size = size; - out->extra_data = xcalloc(1, size); - - debug_printf("\t\t%s: allocated buffer %p of size %i\n", __func__, out, size); - - return Success; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_video_buffer_free -- - * - * Frees and unmaps an allocated kernel buffer. - * - * Results: - * Success. - * - * Side effects: - * Calls into the kernel, sets members of out to 0. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_video_buffer_free(struct vmw_customizer *vmw, - struct vmw_video_buffer *out) -{ - if (out->size == 0) - return Success; - - xfree(out->extra_data); - vmw_ioctl_buffer_unmap(vmw, out->buf); - vmw_ioctl_buffer_destroy(vmw, out->buf); - - out->buf = NULL; - out->data = NULL; - out->handle = 0; - out->size = 0; - - debug_printf("\t\t%s: freed buffer %p\n", __func__, out); - - return Success; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_xv_put_image -- - * - * Main video playback function. It copies the passed data which is in - * the specified format (e.g. FOURCC_YV12) into the overlay. - * - * If sync is TRUE the driver should not return from this - * function until it is through reading the data from buf. - * - * Results: - * Success or XvBadAlloc on failure - * - * Side effects: - * Video port will be played(initialized if 1st frame) on success - * or will fail on error. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_xv_put_image(ScrnInfoPtr pScrn, short src_x, short src_y, - short drw_x, short drw_y, short src_w, short src_h, - short drw_w, short drw_h, int format, - unsigned char *buf, short width, short height, - Bool sync, RegionPtr clipBoxes, pointer data, - DrawablePtr dst) -{ - struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); - struct vmw_video_port *port = data; - - debug_printf("%s: enter (%u, %u) (%ux%u) (%u, %u) (%ux%u) (%ux%u)\n", __func__, - src_x, src_y, src_w, src_h, - drw_x, drw_y, drw_w, drw_h, - width, height); - - if (!vmw->video_priv) - return XvBadAlloc; - - return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, src_h, - drw_w, drw_h, format, buf, width, height, clipBoxes); -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_xv_stop_video -- - * - * Called when we should stop playing video for a particular stream. If - * Cleanup is FALSE, the "stop" operation is only temporary, and thus we - * don't do anything. If Cleanup is TRUE we kill the video port by - * sending a message to the host and freeing up the stream. - * - * Results: - * None. - * - * Side effects: - * See above. - * - *----------------------------------------------------------------------------- - */ - -static void -vmw_xv_stop_video(ScrnInfoPtr pScrn, pointer data, Bool cleanup) -{ - struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); - struct vmw_video_port *port = data; - struct drm_vmw_control_stream_arg arg; - int ret; - - debug_printf("%s: cleanup is %s\n", __func__, cleanup ? "TRUE" : "FALSE"); - - if (!vmw->video_priv) - return; - - if (!cleanup) - return; - - - memset(&arg, 0, sizeof(arg)); - arg.stream_id = port->streamId; - arg.enabled = FALSE; - - ret = drmCommandWrite(vmw->fd, DRM_VMW_CONTROL_STREAM, &arg, sizeof(arg)); - assert(ret == 0); - - vmw_video_port_cleanup(pScrn, port); -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_xv_query_image_attributes -- - * - * From the spec: This function is called to let the driver specify how data - * for a particular image of size width by height should be stored. - * Sometimes only the size and corrected width and height are needed. In - * that case pitches and offsets are NULL. - * - * Results: - * The size of the memory required for the image, or -1 on error. - * - * Side effects: - * None. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_xv_query_image_attributes(ScrnInfoPtr pScrn, int format, - unsigned short *width, unsigned short *height, - int *pitches, int *offsets) -{ - INT32 size, tmp; - - if (*width > VMWARE_VID_MAX_WIDTH) { - *width = VMWARE_VID_MAX_WIDTH; - } - if (*height > VMWARE_VID_MAX_HEIGHT) { - *height = VMWARE_VID_MAX_HEIGHT; - } - - *width = (*width + 1) & ~1; - if (offsets != NULL) { - offsets[0] = 0; - } - - switch (format) { - case FOURCC_YV12: - *height = (*height + 1) & ~1; - size = (*width + 3) & ~3; - if (pitches) { - pitches[0] = size; - } - size *= *height; - if (offsets) { - offsets[1] = size; - } - tmp = ((*width >> 1) + 3) & ~3; - if (pitches) { - pitches[1] = pitches[2] = tmp; - } - tmp *= (*height >> 1); - size += tmp; - if (offsets) { - offsets[2] = size; - } - size += tmp; - break; - case FOURCC_UYVY: - case FOURCC_YUY2: - size = *width * 2; - if (pitches) { - pitches[0] = size; - } - size *= *height; - break; - default: - debug_printf("Query for invalid video format %d\n", format); - return -1; - } - return size; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_xv_set_port_attribute -- - * - * From the spec: A port may have particular attributes such as colorKey, hue, - * saturation, brightness or contrast. Xv clients set these - * attribute values by sending attribute strings (Atoms) to the server. - * - * Results: - * Success if the attribute exists and XvBadAlloc otherwise. - * - * Side effects: - * The respective attribute gets the new value. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_xv_set_port_attribute(ScrnInfoPtr pScrn, Atom attribute, - INT32 value, pointer data) -{ - struct vmw_video_port *port = data; - Atom xvColorKey = MAKE_ATOM("XV_COLORKEY"); - Atom xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY"); - - if (attribute == xvColorKey) { - debug_printf("%s: Set colorkey:0x%x\n", __func__, (unsigned)value); - port->colorKey = value; - } else if (attribute == xvAutoPaint) { - debug_printf("%s: Set autoPaint: %s\n", __func__, value? "TRUE": "FALSE"); - port->isAutoPaintColorkey = value; - } else { - return XvBadAlloc; - } - - return Success; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_xv_get_port_attribute -- - * - * From the spec: A port may have particular attributes such as hue, - * saturation, brightness or contrast. Xv clients get these - * attribute values by sending attribute strings (Atoms) to the server - * - * Results: - * Success if the attribute exists and XvBadAlloc otherwise. - * - * Side effects: - * "value" contains the requested attribute on success. - * - *----------------------------------------------------------------------------- - */ - -static int -vmw_xv_get_port_attribute(ScrnInfoPtr pScrn, Atom attribute, - INT32 *value, pointer data) -{ - struct vmw_video_port *port = data; - Atom xvColorKey = MAKE_ATOM("XV_COLORKEY"); - Atom xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY"); - - if (attribute == xvColorKey) { - *value = port->colorKey; - } else if (attribute == xvAutoPaint) { - *value = port->isAutoPaintColorkey; - } else { - return XvBadAlloc; - } - - return Success; -} - - -/* - *----------------------------------------------------------------------------- - * - * vmw_xv_query_best_size -- - * - * From the spec: QueryBestSize provides the client with a way to query what - * the destination dimensions would end up being if they were to request - * that an area vid_w by vid_h from the video stream be scaled to rectangle - * of drw_w by drw_h on the screen. Since it is not expected that all - * hardware will be able to get the target dimensions exactly, it is - * important that the driver provide this function. - * - * This function seems to never be called, but to be on the safe side - * we apply the same logic that QueryImageAttributes has for width - * and height. - * - * Results: - * None. - * - * Side effects: - * None. - * - *----------------------------------------------------------------------------- - */ - -static void -vmw_xv_query_best_size(ScrnInfoPtr pScrn, Bool motion, - short vid_w, short vid_h, short drw_w, - short drw_h, unsigned int *p_w, - unsigned int *p_h, pointer data) -{ - *p_w = (drw_w + 1) & ~1; - *p_h = drw_h; - - return; -} diff --git a/src/gallium/winsys/drm/vmware/xorg/vmw_xorg.c b/src/gallium/winsys/drm/vmware/xorg/vmw_xorg.c deleted file mode 100644 index 87aad25b24..0000000000 --- a/src/gallium/winsys/drm/vmware/xorg/vmw_xorg.c +++ /dev/null @@ -1,191 +0,0 @@ -/********************************************************** - * Copyright 2008-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, sublicense, 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 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 - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * 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. - * - **********************************************************/ - -/** - * @file - * Glue file for Xorg State Tracker. - * - * @author Alan Hourihane <alanh@tungstengraphics.com> - * @author Jakob Bornecrantz <wallbraker@gmail.com> - */ - -#include "vmw_hook.h" - - -/* - * Defines and modinfo - */ - -#define VMWGFX_DRIVER_NAME "vmwgfx" - -#define VMW_STRING_INNER(s) #s -#define VMW_STRING(str) VMW_STRING_INNER(str) - -#define VMWGFX_VERSION_MAJOR 11 -#define VMWGFX_VERSION_MINOR 0 -#define VMWGFX_VERSION_PATCH 0 -#define VMWGFX_VERSION_STRING_MAJOR VMW_STRING(VMWGFX_VERSION_MAJOR) -#define VMWGFX_VERSION_STRING_MINOR VMW_STRING(VMWGFX_VERSION_MINOR) -#define VMWGFX_VERSION_STRING_PATCH VMW_STRING(VMWGFX_VERSION_PATCH) - -#define VMWGFX_DRIVER_VERSION \ - (VMWGFX_VERSION_MAJOR * 65536 + VMWGFX_VERSION_MINOR * 256 + VMWGFX_VERSION_PATCH) -#define VMWGFX_DRIVER_VERSION_STRING \ - VMWGFX_VERSION_STRING_MAJOR "." VMWGFX_VERSION_STRING_MINOR \ - "." VMWGFX_VERSION_STRING_PATCH - -/* - * Standard four digit version string expected by VMware Tools installer. - * As the driver's version is only {major, minor, patchlevel}, simply append an - * extra zero for the fourth digit. - */ -#ifdef __GNUC__ -_X_EXPORT const char vmwgfx_drv_modinfo[] __attribute__((section(".modinfo"),unused)) = - "version=" VMWGFX_DRIVER_VERSION_STRING ".0"; -#endif - -static void vmw_xorg_identify(int flags); -_X_EXPORT Bool vmw_xorg_pci_probe(DriverPtr driver, - int entity_num, - struct pci_device *device, - intptr_t match_data); - - -/* - * Tables - */ - -static const struct pci_id_match vmw_xorg_device_match[] = { - {0x15ad, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0}, -}; - -static SymTabRec vmw_xorg_chipsets[] = { - {PCI_MATCH_ANY, "VMware SVGA Device"}, - {-1, NULL} -}; - -static PciChipsets vmw_xorg_pci_devices[] = { - {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, - {-1, -1, NULL} -}; - -static XF86ModuleVersionInfo vmw_xorg_version = { - VMWGFX_DRIVER_NAME, - MODULEVENDORSTRING, - MODINFOSTRING1, - MODINFOSTRING2, - XORG_VERSION_CURRENT, - VMWGFX_VERSION_MAJOR, VMWGFX_VERSION_MINOR, VMWGFX_VERSION_PATCH, - ABI_CLASS_VIDEODRV, - ABI_VIDEODRV_VERSION, - MOD_CLASS_VIDEODRV, - {0, 0, 0, 0} -}; - -/* - * Xorg driver exported structures - */ - -_X_EXPORT DriverRec vmwgfx = { - 1, - VMWGFX_DRIVER_NAME, - vmw_xorg_identify, - NULL, - xorg_tracker_available_options, - NULL, - 0, - NULL, - vmw_xorg_device_match, - vmw_xorg_pci_probe -}; - -static MODULESETUPPROTO(vmw_xorg_setup); - -_X_EXPORT XF86ModuleData vmwgfxModuleData = { - &vmw_xorg_version, - vmw_xorg_setup, - NULL -}; - - -/* - * Xorg driver functions - */ - -static pointer -vmw_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) -{ - static Bool setupDone = 0; - - /* This module should be loaded only once, but check to be sure. - */ - if (!setupDone) { - setupDone = 1; - xf86AddDriver(&vmwgfx, module, HaveDriverFuncs); - - /* - * The return value must be non-NULL on success even though there - * is no TearDownProc. - */ - return (pointer) 1; - } else { - if (errmaj) - *errmaj = LDR_ONCEONLY; - return NULL; - } -} - -static void -vmw_xorg_identify(int flags) -{ - xf86PrintChipsets("vmwgfx", "Driver for VMware SVGA device", - vmw_xorg_chipsets); -} - -_X_EXPORT Bool -vmw_xorg_pci_probe(DriverPtr driver, - int entity_num, struct pci_device *device, intptr_t match_data) -{ - ScrnInfoPtr scrn = NULL; - EntityInfoPtr entity; - - scrn = xf86ConfigPciEntity(scrn, 0, entity_num, vmw_xorg_pci_devices, - NULL, NULL, NULL, NULL, NULL); - if (scrn != NULL) { - scrn->driverVersion = 1; - scrn->driverName = "vmwgfx"; - scrn->name = "vmwgfx"; - scrn->Probe = NULL; - - entity = xf86GetEntityInfo(entity_num); - - /* Use all the functions from the xorg tracker */ - xorg_tracker_set_functions(scrn); - - vmw_screen_set_functions(scrn); - } - return scrn != NULL; -} |