vl_winsys_xsp.c revision 6414952efe3b53fd33d73d592da74975a1075330
1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/**************************************************************************
2e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton *
3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton.
4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved.
5e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton *
6fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Permission is hereby granted, free of charge, to any person obtaining a
7fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * copy of this software and associated documentation files (the
8fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * "Software"), to deal in the Software without restriction, including
9fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * without limitation the rights to use, copy, modify, merge, publish,
10fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * distribute, sub license, and/or sell copies of the Software, and to
11fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * permit persons to whom the Software is furnished to do so, subject to
12fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * the following conditions:
13e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton *
14fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * The above copyright notice and this permission notice (including the
15fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * next paragraph) shall be included in all copies or substantial portions
16fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * of the Software.
17e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton *
18fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton *
26fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton **************************************************************************/
27fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton
28e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <vl_winsys.h>
296414952efe3b53fd33d73d592da74975a1075330Younes Manton#include <X11/Xlibint.h>
302c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton#include <state_tracker/xlib_sw_winsys.h>
31e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <util/u_memory.h>
326414952efe3b53fd33d73d592da74975a1075330Younes Manton#include <util/u_format.h>
332c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton#include <softpipe/sp_public.h>
34e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_video_context.h>
35e44c85637a3298918e292e9ddba812856cf92924Younes Manton
366414952efe3b53fd33d73d592da74975a1075330Younes Mantonstruct vl_xsp_screen
37e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton{
386414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct vl_screen base;
396414952efe3b53fd33d73d592da74975a1075330Younes Manton   Display *display;
406414952efe3b53fd33d73d592da74975a1075330Younes Manton   int screen;
416414952efe3b53fd33d73d592da74975a1075330Younes Manton   Visual visual;
426414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct xlib_drawable xdraw;
436414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct pipe_surface *drawable_surface;
446414952efe3b53fd33d73d592da74975a1075330Younes Manton};
456414952efe3b53fd33d73d592da74975a1075330Younes Manton
466414952efe3b53fd33d73d592da74975a1075330Younes Mantonstruct pipe_surface*
476414952efe3b53fd33d73d592da74975a1075330Younes Mantonvl_drawable_surface_get(struct vl_screen *vscreen, Drawable drawable)
48e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
496414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct vl_xsp_screen *xsp_screen = (struct vl_xsp_screen*)vscreen;
500e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton   Window root;
510e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton   int x, y;
520e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton   unsigned int width, height;
530e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton   unsigned int border_width;
540e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton   unsigned int depth;
556414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct pipe_resource templat, *drawable_tex;
566414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct pipe_surface *drawable_surface = NULL;
57e44c85637a3298918e292e9ddba812856cf92924Younes Manton
580e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton   assert(vscreen);
596414952efe3b53fd33d73d592da74975a1075330Younes Manton   assert(drawable != None);
606414952efe3b53fd33d73d592da74975a1075330Younes Manton
616414952efe3b53fd33d73d592da74975a1075330Younes Manton   if (XGetGeometry(xsp_screen->display, drawable, &root, &x, &y, &width, &height, &border_width, &depth) == BadDrawable)
626414952efe3b53fd33d73d592da74975a1075330Younes Manton      return NULL;
636414952efe3b53fd33d73d592da74975a1075330Younes Manton
646414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->xdraw.drawable = drawable;
656414952efe3b53fd33d73d592da74975a1075330Younes Manton
666414952efe3b53fd33d73d592da74975a1075330Younes Manton   if (xsp_screen->drawable_surface) {
676414952efe3b53fd33d73d592da74975a1075330Younes Manton      if (xsp_screen->drawable_surface->width == width &&
686414952efe3b53fd33d73d592da74975a1075330Younes Manton          xsp_screen->drawable_surface->height == height) {
696414952efe3b53fd33d73d592da74975a1075330Younes Manton         pipe_surface_reference(&drawable_surface, xsp_screen->drawable_surface);
706414952efe3b53fd33d73d592da74975a1075330Younes Manton         return drawable_surface;
716414952efe3b53fd33d73d592da74975a1075330Younes Manton      }
726414952efe3b53fd33d73d592da74975a1075330Younes Manton      else
736414952efe3b53fd33d73d592da74975a1075330Younes Manton         pipe_surface_reference(&xsp_screen->drawable_surface, NULL);
746414952efe3b53fd33d73d592da74975a1075330Younes Manton   }
756414952efe3b53fd33d73d592da74975a1075330Younes Manton
766414952efe3b53fd33d73d592da74975a1075330Younes Manton   memset(&templat, 0, sizeof(struct pipe_resource));
776414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.target = PIPE_TEXTURE_2D;
786414952efe3b53fd33d73d592da74975a1075330Younes Manton   /* XXX: Need to figure out drawable's format */
796414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.format = PIPE_FORMAT_B8G8R8X8_UNORM;
806414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.last_level = 0;
816414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.width0 = width;
826414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.height0 = height;
836414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.depth0 = 1;
846414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.usage = PIPE_USAGE_DEFAULT;
856414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_BLIT_SOURCE;
866414952efe3b53fd33d73d592da74975a1075330Younes Manton   templat.flags = 0;
876414952efe3b53fd33d73d592da74975a1075330Younes Manton
886414952efe3b53fd33d73d592da74975a1075330Younes Manton   drawable_tex = vscreen->pscreen->resource_create(vscreen->pscreen, &templat);
896414952efe3b53fd33d73d592da74975a1075330Younes Manton   if (!drawable_tex)
906414952efe3b53fd33d73d592da74975a1075330Younes Manton      return NULL;
916414952efe3b53fd33d73d592da74975a1075330Younes Manton
926414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->drawable_surface = vscreen->pscreen->get_tex_surface(vscreen->pscreen, drawable_tex,
936414952efe3b53fd33d73d592da74975a1075330Younes Manton                                                                    0, 0, 0,
946414952efe3b53fd33d73d592da74975a1075330Younes Manton                                                                    templat.bind);
956414952efe3b53fd33d73d592da74975a1075330Younes Manton   pipe_resource_reference(&drawable_tex, NULL);
960e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton
976414952efe3b53fd33d73d592da74975a1075330Younes Manton   if (!xsp_screen->drawable_surface)
980e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton      return NULL;
99e44c85637a3298918e292e9ddba812856cf92924Younes Manton
1006414952efe3b53fd33d73d592da74975a1075330Younes Manton   pipe_surface_reference(&drawable_surface, xsp_screen->drawable_surface);
1016414952efe3b53fd33d73d592da74975a1075330Younes Manton
1026414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->xdraw.depth = 24/*util_format_get_blocksizebits(templat.format) /
1036414952efe3b53fd33d73d592da74975a1075330Younes Manton                             util_format_get_blockwidth(templat.format)*/;
1046414952efe3b53fd33d73d592da74975a1075330Younes Manton
1056414952efe3b53fd33d73d592da74975a1075330Younes Manton   return drawable_surface;
1066414952efe3b53fd33d73d592da74975a1075330Younes Manton}
1076414952efe3b53fd33d73d592da74975a1075330Younes Manton
1086414952efe3b53fd33d73d592da74975a1075330Younes Mantonvoid*
1096414952efe3b53fd33d73d592da74975a1075330Younes Mantonvl_contextprivate_get(struct vl_context *vctx, struct pipe_surface *drawable_surface)
1106414952efe3b53fd33d73d592da74975a1075330Younes Manton{
1116414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct vl_xsp_screen *xsp_screen = (struct vl_xsp_screen*)vctx->vscreen;
112e44c85637a3298918e292e9ddba812856cf92924Younes Manton
1136414952efe3b53fd33d73d592da74975a1075330Younes Manton   assert(vctx);
1146414952efe3b53fd33d73d592da74975a1075330Younes Manton   assert(drawable_surface);
1156414952efe3b53fd33d73d592da74975a1075330Younes Manton   assert(xsp_screen->drawable_surface == drawable_surface);
1160e59cd33e6a38567801c7da541e4caffbd6cccd3Younes Manton
1176414952efe3b53fd33d73d592da74975a1075330Younes Manton   return &xsp_screen->xdraw;
118e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
119e44c85637a3298918e292e9ddba812856cf92924Younes Manton
120e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonstruct vl_screen*
121e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_screen_create(Display *display, int screen)
122e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
1236414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct vl_xsp_screen *xsp_screen;
1242c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   struct sw_winsys *winsys;
125f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
126f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(display);
127f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
1286414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen = CALLOC_STRUCT(vl_xsp_screen);
1296414952efe3b53fd33d73d592da74975a1075330Younes Manton   if (!xsp_screen)
130e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      return NULL;
131e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
1322c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   winsys = xlib_create_sw_winsys(display);
1332c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   if (!winsys) {
1346414952efe3b53fd33d73d592da74975a1075330Younes Manton      FREE(xsp_screen);
135f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
136e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   }
137f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
1386414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->base.pscreen = softpipe_create_screen(winsys);
1396414952efe3b53fd33d73d592da74975a1075330Younes Manton   if (!xsp_screen->base.pscreen) {
1402c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton      winsys->destroy(winsys);
1416414952efe3b53fd33d73d592da74975a1075330Younes Manton      FREE(xsp_screen);
142e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      return NULL;
143e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   }
144e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
1456414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->display = display;
1466414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->screen = screen;
1476414952efe3b53fd33d73d592da74975a1075330Younes Manton   xsp_screen->xdraw.visual = XDefaultVisual(display, screen);
148e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
1496414952efe3b53fd33d73d592da74975a1075330Younes Manton   return &xsp_screen->base;
150e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton}
151e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
152e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvoid vl_screen_destroy(struct vl_screen *vscreen)
153e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton{
1546414952efe3b53fd33d73d592da74975a1075330Younes Manton   struct vl_xsp_screen *xsp_screen = (struct vl_xsp_screen*)vscreen;
1556414952efe3b53fd33d73d592da74975a1075330Younes Manton
156e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vscreen);
157e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
1586414952efe3b53fd33d73d592da74975a1075330Younes Manton   pipe_surface_reference(&xsp_screen->drawable_surface, NULL);
159e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vscreen->pscreen->destroy(vscreen->pscreen);
160e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   FREE(vscreen);
161e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
162e44c85637a3298918e292e9ddba812856cf92924Younes Manton
163e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonstruct vl_context*
164e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvl_video_create(struct vl_screen *vscreen,
165e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_profile profile,
166e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_chroma_format chroma_format,
167e44c85637a3298918e292e9ddba812856cf92924Younes Manton                unsigned width, unsigned height)
168e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
169f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_video_context *vpipe;
1702c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   struct vl_context *vctx;
171e44c85637a3298918e292e9ddba812856cf92924Younes Manton
172e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vscreen);
173f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(width && height);
1740a51e8633287b97b4d88e0cb553854535f2fa5e7Younes Manton   assert(vscreen->pscreen->video_context_create);
175e44c85637a3298918e292e9ddba812856cf92924Younes Manton
1760a51e8633287b97b4d88e0cb553854535f2fa5e7Younes Manton   vpipe = vscreen->pscreen->video_context_create(vscreen->pscreen,
1770a51e8633287b97b4d88e0cb553854535f2fa5e7Younes Manton                                                  profile,
1780a51e8633287b97b4d88e0cb553854535f2fa5e7Younes Manton                                                  chroma_format,
1790a51e8633287b97b4d88e0cb553854535f2fa5e7Younes Manton                                                  width, height, NULL);
180f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!vpipe)
181f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
182e44c85637a3298918e292e9ddba812856cf92924Younes Manton
1832c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   vctx = CALLOC_STRUCT(vl_context);
1842c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   if (!vctx) {
185f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      vpipe->destroy(vpipe);
186f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
187f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   }
188e44c85637a3298918e292e9ddba812856cf92924Younes Manton
1892c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   vpipe->priv = vctx;
1902c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   vctx->vpipe = vpipe;
1912c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   vctx->vscreen = vscreen;
192e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
1932c29a93e875dd96fb08c65ec659efc3eb2d5c15eYounes Manton   return vctx;
194e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton}
195e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
196e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvoid vl_video_destroy(struct vl_context *vctx)
197e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton{
198e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vctx);
199e44c85637a3298918e292e9ddba812856cf92924Younes Manton
200e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vctx->vpipe->destroy(vctx->vpipe);
201e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   FREE(vctx);
202e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
203