dri_context.c revision ecd7ec9d62d2ba919410218f4cf3f69772681f3c
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**************************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
3103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Copyright 2009, VMware, Inc.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Permission is hereby granted, free of charge, to any person obtaining a
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * copy of this software and associated documentation files (the
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "Software"), to deal in the Software without restriction, including
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * without limitation the rights to use, copy, modify, merge, publish,
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * distribute, sub license, and/or sell copies of the Software, and to
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * permit persons to whom the Software is furnished to do so, subject to
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the following conditions:
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The above copyright notice and this permission notice (including the
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * next paragraph) shall be included in all copies or substantial portions
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of the Software.
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru **************************************************************************/
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Author: Keith Whitwell <keithw@vmware.com>
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Author: Jakob Bornecrantz <wallbraker@gmail.com>
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "utils.h"
3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "dri_screen.h"
35103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "dri_drawable.h"
36103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "dri_context.h"
37103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "pipe/p_context.h"
3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "state_tracker/st_context.h"
4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
4150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodri_init_extensions(struct dri_context *ctx)
4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_context *st = (struct st_context *) ctx->st;
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /* New extensions should be added in mesa/state_tracker/st_extensions.c
4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * and not in this file. */
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   driInitExtensions(st->ctx, NULL, GL_FALSE);
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
5150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoGLboolean
5250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodri_create_context(gl_api api, const __GLcontextModes * visual,
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru		   __DRIcontext * cPriv, void *sharedContextPrivate)
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   __DRIscreen *sPriv = cPriv->driScreenPriv;
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_screen *screen = dri_screen(sPriv);
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_api *stapi = screen->st_api;
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_context *ctx = NULL;
5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_context_iface *st_share = NULL;
6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_visual stvis;
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (api != API_OPENGL)
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      return GL_FALSE;
6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (sharedContextPrivate) {
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      st_share = ((struct dri_context *)sharedContextPrivate)->st;
6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   }
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx = CALLOC_STRUCT(dri_context);
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (ctx == NULL)
7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      goto fail;
7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   cPriv->driverPrivate = ctx;
7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->cPriv = cPriv;
7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->sPriv = sPriv;
7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->lock = screen->drmLock;
7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   driParseConfigFiles(&ctx->optionCache,
79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		       &screen->optionCache, sPriv->myNum, "dri");
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   dri_fill_st_visual(&stvis, screen, visual);
8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->st = stapi->create_context(stapi, &screen->base, &stvis, st_share);
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (ctx->st == NULL)
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      goto fail;
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->st->st_manager_private = (void *) ctx;
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   dri_init_extensions(ctx);
8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   return GL_TRUE;
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fail:
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (ctx && ctx->st)
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      ctx->st->destroy(ctx->st);
9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   FREE(ctx);
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   return GL_FALSE;
9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodri_destroy_context(__DRIcontext * cPriv)
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_context *ctx = dri_context(cPriv);
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /* note: we are freeing values and nothing more because
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * driParseConfigFiles allocated values only - the rest
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * is owned by screen optionCache.
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    */
10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   FREE(ctx->optionCache.values);
10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /* No particular reason to wait for command completion before
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * destroying a context, but it is probably worthwhile flushing it
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * to avoid having to add code elsewhere to cope with flushing a
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * partially destroyed context.
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    */
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->st->flush(ctx->st, 0, NULL);
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ctx->st->destroy(ctx->st);
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   FREE(ctx);
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
121103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusGLboolean
122103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusdri_unbind_context(__DRIcontext * cPriv)
12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /* dri_util.c ensures cPriv is not null */
12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_screen *screen = dri_screen(cPriv->driScreenPriv);
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_context *ctx = dri_context(cPriv);
12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_api *stapi = screen->st_api;
12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (--ctx->bind_count == 0) {
13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      if (ctx->st == stapi->get_current(stapi)) {
13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         stapi->make_current(stapi, NULL, NULL, NULL);
13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      }
13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   }
13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   return GL_TRUE;
13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoGLboolean
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodri_make_current(__DRIcontext * cPriv,
14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho		 __DRIdrawable * driDrawPriv,
14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho		 __DRIdrawable * driReadPriv)
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /* dri_util.c ensures cPriv is not null */
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_screen *screen = dri_screen(cPriv->driScreenPriv);
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_context *ctx = dri_context(cPriv);
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_api *stapi = screen->st_api;
14827f654740f2a26ad62a5c155af9199af9e69b889claireho   struct dri_drawable *draw = dri_drawable(driDrawPriv);
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_drawable *read = dri_drawable(driReadPriv);
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_context_iface *old_st = stapi->get_current(stapi);
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (old_st && old_st != ctx->st)
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      old_st->flush(old_st, PIPE_FLUSH_RENDER_CACHE, NULL);
15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   ++ctx->bind_count;
15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (ctx->dPriv != driDrawPriv) {
15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      ctx->dPriv = driDrawPriv;
15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      draw->texture_stamp = driDrawPriv->lastStamp - 1;
16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   }
16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (ctx->rPriv != driReadPriv) {
16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      ctx->rPriv = driReadPriv;
16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      read->texture_stamp = driReadPriv->lastStamp - 1;
16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   }
16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   stapi->make_current(stapi, ctx->st, &draw->base, &read->base);
16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   return GL_TRUE;
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct dri_context *
17250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehodri_get_current(__DRIscreen *sPriv)
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct dri_screen *screen = dri_screen(sPriv);
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_api *stapi = screen->st_api;
17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   struct st_context_iface *st;
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   st = stapi->get_current(stapi);
17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   return (struct dri_context *) (st) ? st->st_manager_private : NULL;
18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* vim: set sw=3 ts=8 sts=3 expandtab: */
18450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho