summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys/g3dvl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/g3dvl')
-rw-r--r--src/gallium/winsys/g3dvl/dri/dri_winsys.c137
-rw-r--r--src/gallium/winsys/g3dvl/vl_winsys.h17
-rw-r--r--src/gallium/winsys/g3dvl/xlib/xsp_winsys.c85
3 files changed, 54 insertions, 185 deletions
diff --git a/src/gallium/winsys/g3dvl/dri/dri_winsys.c b/src/gallium/winsys/g3dvl/dri/dri_winsys.c
index 1875d49e139..904a6d796fc 100644
--- a/src/gallium/winsys/g3dvl/dri/dri_winsys.c
+++ b/src/gallium/winsys/g3dvl/dri/dri_winsys.c
@@ -54,69 +54,13 @@ struct vl_dri_screen
Drawable last_seen_drawable;
};
-static struct pipe_surface*
-vl_dri2_get_front(struct vl_context *vctx, Drawable drawable)
-{
- int w, h;
- unsigned int attachments[1] = {DRI2BufferFrontLeft};
- int count;
- DRI2Buffer *dri2_front;
- struct pipe_resource *front_tex;
- struct pipe_surface *front_surf = NULL;
-
- assert(vctx);
-
- struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)vctx->vscreen;
- assert(vl_dri_scrn);
-
- dri2_front = DRI2GetBuffers(vl_dri_scrn->display, drawable, &w, &h,
- attachments, 1, &count);
-
- assert(count == 1);
-
- if (dri2_front) {
- struct winsys_handle dri2_front_handle =
- {
- .type = DRM_API_HANDLE_TYPE_SHARED,
- .handle = dri2_front->name,
- .stride = dri2_front->pitch
- };
- struct pipe_resource template;
- struct pipe_surface surf_template;
-
- memset(&template, 0, sizeof(struct pipe_resource));
- template.target = PIPE_TEXTURE_2D;
- template.format = PIPE_FORMAT_B8G8R8X8_UNORM;
- template.last_level = 0;
- template.width0 = w;
- template.height0 = h;
- template.depth0 = 1;
- template.usage = PIPE_USAGE_STATIC;
- template.bind = PIPE_BIND_RENDER_TARGET;
- template.flags = 0;
-
- front_tex = vl_dri_scrn->base.pscreen->resource_from_handle(vl_dri_scrn->base.pscreen, &template, &dri2_front_handle);
- if (front_tex) {
- memset(&surf_template, 0, sizeof(surf_template));
- surf_template.format = front_tex->format;
- surf_template.usage = PIPE_BIND_RENDER_TARGET;
- front_surf = vctx->pipe->create_surface(vctx->pipe, front_tex, &surf_template);
- }
- pipe_resource_reference(&front_tex, NULL);
- Xfree(dri2_front);
- }
-
- return front_surf;
-}
-
static void
vl_dri2_flush_frontbuffer(struct pipe_screen *screen,
struct pipe_resource *resource,
unsigned level, unsigned layer,
void *context_private)
{
- struct vl_context *vl_dri_ctx = (struct vl_context*)context_private;
- struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)vl_dri_ctx->vscreen;
+ struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)context_private;
XserverRegion region;
assert(screen);
@@ -129,12 +73,16 @@ vl_dri2_flush_frontbuffer(struct pipe_screen *screen,
XFixesDestroyRegion(vl_dri_scrn->display, region);
}
-struct pipe_surface*
-vl_drawable_surface_get(struct vl_context *vctx, Drawable drawable)
+struct pipe_resource*
+vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable drawable)
{
- assert(vctx);
+ struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)vscreen;
+ unsigned int attachments[1] = {DRI2BufferFrontLeft};
+ struct winsys_handle dri2_front_handle;
+ struct pipe_resource template, *tex;
+ DRI2Buffer *dri2_front;
+ int w, h, count;
- struct vl_dri_screen *vl_dri_scrn = (struct vl_dri_screen*)vctx->vscreen;
assert(vl_dri_scrn);
if (vl_dri_scrn->last_seen_drawable != drawable) {
@@ -148,13 +96,39 @@ vl_drawable_surface_get(struct vl_context *vctx, Drawable drawable)
vl_dri_scrn->last_seen_drawable = drawable;
}
- return vl_dri2_get_front(vctx, drawable);
+ dri2_front = DRI2GetBuffers(vl_dri_scrn->display, drawable, &w, &h, attachments, 1, &count);
+
+ assert(count == 1);
+
+ if (!dri2_front)
+ return NULL;
+
+ memset(&dri2_front_handle, 0, sizeof(dri2_front_handle));
+ dri2_front_handle.type = DRM_API_HANDLE_TYPE_SHARED;
+ dri2_front_handle.handle = dri2_front->name;
+ dri2_front_handle.stride = dri2_front->pitch;
+
+ memset(&template, 0, sizeof(template));
+ template.target = PIPE_TEXTURE_2D;
+ template.format = PIPE_FORMAT_B8G8R8X8_UNORM;
+ template.last_level = 0;
+ template.width0 = w;
+ template.height0 = h;
+ template.depth0 = 1;
+ template.usage = PIPE_USAGE_STATIC;
+ template.bind = PIPE_BIND_RENDER_TARGET;
+ template.flags = 0;
+
+ tex = vl_dri_scrn->base.pscreen->resource_from_handle(vl_dri_scrn->base.pscreen, &template, &dri2_front_handle);
+ Xfree(dri2_front);
+
+ return tex;
}
void*
-vl_contextprivate_get(struct vl_context *vctx, struct pipe_surface *displaytarget)
+vl_screen_get_private(struct vl_screen *vscreen)
{
- return vctx;
+ return vscreen;
}
static unsigned drawable_hash(void *key)
@@ -237,38 +211,3 @@ void vl_screen_destroy(struct vl_screen *vscreen)
vl_dri_scrn->base.pscreen->destroy(vl_dri_scrn->base.pscreen);
FREE(vl_dri_scrn);
}
-
-struct vl_context*
-vl_video_create(struct vl_screen *vscreen)
-{
- struct vl_context *vl_dri_ctx;
-
- vl_dri_ctx = CALLOC_STRUCT(vl_context);
- if (!vl_dri_ctx)
- goto no_struct;
-
- vl_dri_ctx->vscreen = vscreen;
- vl_dri_ctx->pipe = vscreen->pscreen->context_create(vscreen->pscreen, vl_dri_ctx);
- if (!vl_dri_ctx->pipe) {
- debug_printf("[G3DVL] No video support found on %s/%s.\n",
- vscreen->pscreen->get_vendor(vscreen->pscreen),
- vscreen->pscreen->get_name(vscreen->pscreen));
- goto no_pipe;
- }
-
- return vl_dri_ctx;
-
-no_pipe:
- FREE(vl_dri_ctx);
-
-no_struct:
- return NULL;
-}
-
-void vl_video_destroy(struct vl_context *vctx)
-{
- assert(vctx);
-
- vctx->pipe->destroy(vctx->pipe);
- FREE(vctx);
-}
diff --git a/src/gallium/winsys/g3dvl/vl_winsys.h b/src/gallium/winsys/g3dvl/vl_winsys.h
index 2782e513880..3e7d771db2f 100644
--- a/src/gallium/winsys/g3dvl/vl_winsys.h
+++ b/src/gallium/winsys/g3dvl/vl_winsys.h
@@ -40,26 +40,15 @@ struct vl_screen
struct pipe_screen *pscreen;
};
-struct vl_context
-{
- struct vl_screen *vscreen;
- struct pipe_context *pipe;
-};
-
struct vl_screen*
vl_screen_create(Display *display, int screen);
void vl_screen_destroy(struct vl_screen *vscreen);
-struct vl_context*
-vl_video_create(struct vl_screen *vscreen);
-
-void vl_video_destroy(struct vl_context *vctx);
-
-struct pipe_surface*
-vl_drawable_surface_get(struct vl_context *vctx, Drawable drawable);
+struct pipe_resource*
+vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable drawable);
void*
-vl_contextprivate_get(struct vl_context *vctx, struct pipe_surface *drawable_surface);
+vl_screen_get_private(struct vl_screen *vscreen);
#endif
diff --git a/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c b/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
index c0c7cdea737..2ff5ef19580 100644
--- a/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
+++ b/src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
@@ -31,8 +31,6 @@
#include "util/u_format.h"
#include "util/u_inlines.h"
-#include <X11/Xlibint.h>
-
#include "state_tracker/xlib_sw_winsys.h"
#include "softpipe/sp_public.h"
@@ -45,21 +43,19 @@ struct vl_xsp_screen
int screen;
Visual visual;
struct xlib_drawable xdraw;
- struct pipe_surface *drawable_surface;
+ struct pipe_resource *tex;
};
-struct pipe_surface*
-vl_drawable_surface_get(struct vl_context *vctx, Drawable drawable)
+struct pipe_resource*
+vl_screen_texture_from_drawable(struct vl_screen *vscreen, Drawable drawable)
{
- struct vl_screen *vscreen = vctx->vscreen;
struct vl_xsp_screen *xsp_screen = (struct vl_xsp_screen*)vscreen;
Window root;
int x, y;
unsigned int width, height;
unsigned int border_width;
unsigned int depth;
- struct pipe_resource templat, *drawable_tex;
- struct pipe_surface surf_template, *drawable_surface = NULL;
+ struct pipe_resource templat;
assert(vscreen);
assert(drawable != None);
@@ -69,14 +65,11 @@ vl_drawable_surface_get(struct vl_context *vctx, Drawable drawable)
xsp_screen->xdraw.drawable = drawable;
- if (xsp_screen->drawable_surface) {
- if (xsp_screen->drawable_surface->width == width &&
- xsp_screen->drawable_surface->height == height) {
- pipe_surface_reference(&drawable_surface, xsp_screen->drawable_surface);
- return drawable_surface;
- }
+ if (xsp_screen->tex) {
+ if (xsp_screen->tex->width0 == width && xsp_screen->tex->height0 == height)
+ return xsp_screen->tex;
else
- pipe_surface_reference(&xsp_screen->drawable_surface, NULL);
+ pipe_resource_reference(&xsp_screen->tex, NULL);
}
memset(&templat, 0, sizeof(struct pipe_resource));
@@ -91,37 +84,17 @@ vl_drawable_surface_get(struct vl_context *vctx, Drawable drawable)
templat.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET;
templat.flags = 0;
- drawable_tex = vscreen->pscreen->resource_create(vscreen->pscreen, &templat);
- if (!drawable_tex)
- return NULL;
-
- memset(&surf_template, 0, sizeof(surf_template));
- surf_template.format = templat.format;
- surf_template.usage = PIPE_BIND_RENDER_TARGET;
- xsp_screen->drawable_surface = vctx->pipe->create_surface(vctx->pipe, drawable_tex,
- &surf_template);
- pipe_resource_reference(&drawable_tex, NULL);
-
- if (!xsp_screen->drawable_surface)
- return NULL;
-
- pipe_surface_reference(&drawable_surface, xsp_screen->drawable_surface);
-
xsp_screen->xdraw.depth = 24/*util_format_get_blocksizebits(templat.format) /
util_format_get_blockwidth(templat.format)*/;
- return drawable_surface;
+ xsp_screen->tex = vscreen->pscreen->resource_create(vscreen->pscreen, &templat);
+ return xsp_screen->tex;
}
void*
-vl_contextprivate_get(struct vl_context *vctx, struct pipe_surface *drawable_surface)
+vl_screen_get_private(struct vl_screen *vscreen)
{
- struct vl_xsp_screen *xsp_screen = (struct vl_xsp_screen*)vctx->vscreen;
-
- assert(vctx);
- assert(drawable_surface);
- assert(xsp_screen->drawable_surface == drawable_surface);
-
+ struct vl_xsp_screen *xsp_screen = (struct vl_xsp_screen*)vscreen;
return &xsp_screen->xdraw;
}
@@ -163,39 +136,7 @@ void vl_screen_destroy(struct vl_screen *vscreen)
assert(vscreen);
- pipe_surface_reference(&xsp_screen->drawable_surface, NULL);
+ pipe_resource_reference(&xsp_screen->tex, NULL);
vscreen->pscreen->destroy(vscreen->pscreen);
FREE(vscreen);
}
-
-struct vl_context*
-vl_video_create(struct vl_screen *vscreen)
-{
- struct pipe_context *pipe;
- struct vl_context *vctx;
-
- assert(vscreen);
-
- pipe = vscreen->pscreen->context_create(vscreen->pscreen, NULL);
- if (!pipe)
- return NULL;
-
- vctx = CALLOC_STRUCT(vl_context);
- if (!vctx) {
- pipe->destroy(pipe);
- return NULL;
- }
-
- vctx->pipe = pipe;
- vctx->vscreen = vscreen;
-
- return vctx;
-}
-
-void vl_video_destroy(struct vl_context *vctx)
-{
- assert(vctx);
-
- vctx->pipe->destroy(vctx->pipe);
- FREE(vctx);
-}