dri_context.c revision ae79e778f7fae99812ade79ecf5cf3c783d2a93b
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/**************************************************************************
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2009, VMware, Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * All Rights Reserved.
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Permission is hereby granted, free of charge, to any person obtaining a
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * copy of this software and associated documentation files (the
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * "Software"), to deal in the Software without restriction, including
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * without limitation the rights to use, copy, modify, merge, publish,
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * distribute, sub license, and/or sell copies of the Software, and to
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * permit persons to whom the Software is furnished to do so, subject to
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * the following conditions:
13c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com *
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * The above copyright notice and this permission notice (including the
15548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com * next paragraph) shall be included in all copies or substantial portions
16548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com * of the Software.
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
183334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com **************************************************************************/
273334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org/*
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Author: Keith Whitwell <keithw@vmware.com>
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Author: Jakob Bornecrantz <wallbraker@gmail.com>
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "utils.h"
333334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
344bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com#include "dri_screen.h"
35548a1f321011292359ef163f78c8a1d4871b3b7freed@google.com#include "dri_drawable.h"
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "dri_context.h"
373334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "pipe/p_context.h"
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "state_tracker/st_context.h"
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comdri_init_extensions(struct dri_context *ctx)
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   struct st_context *st = (struct st_context *) ctx->st;
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   /* New extensions should be added in mesa/state_tracker/st_extensions.c
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    * and not in this file. */
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   driInitExtensions(st->ctx, NULL, GL_FALSE);
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comGLboolean
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comdri_create_context(const __GLcontextModes * visual,
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com		   __DRIcontext * cPriv, void *sharedContextPrivate)
544a3b714d73e585a3985d614600c6b79d5c8b1f1ereed@google.com{
553334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   __DRIscreen *sPriv = cPriv->driScreenPriv;
563334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   struct dri_screen *screen = dri_screen(sPriv);
573334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   struct st_api *stapi = screen->st_api;
583334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   struct dri_context *ctx = NULL;
593334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   struct st_context_iface *st_share = NULL;
603334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   struct st_visual stvis;
613334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
623334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   if (sharedContextPrivate) {
633334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org      st_share = ((struct dri_context *)sharedContextPrivate)->st;
643334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   }
653334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
663334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   ctx = CALLOC_STRUCT(dri_context);
673334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   if (ctx == NULL)
683334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org      goto fail;
693334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   cPriv->driverPrivate = ctx;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   ctx->cPriv = cPriv;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   ctx->sPriv = sPriv;
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   ctx->lock = screen->drmLock;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
753334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   driParseConfigFiles(&ctx->optionCache,
763334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org		       &screen->optionCache, sPriv->myNum, "dri");
773334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   dri_fill_st_visual(&stvis, screen, visual);
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   ctx->st = stapi->create_context(stapi, &screen->base, &stvis, st_share);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   if (ctx->st == NULL)
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      goto fail;
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   ctx->st->st_manager_private = (void *) ctx;
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
843334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   dri_init_extensions(ctx);
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
863334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   return GL_TRUE;
873334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
883334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org fail:
893334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   if (ctx && ctx->st)
903334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org      ctx->st->destroy(ctx->st);
913334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
923334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   FREE(ctx);
933334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   return FALSE;
943334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org}
953334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
963334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.orgvoid
973334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.orgdri_destroy_context(__DRIcontext * cPriv)
983334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org{
993334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   struct dri_context *ctx = dri_context(cPriv);
1003334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
1013334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   /* note: we are freeing values and nothing more because
1023334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    * driParseConfigFiles allocated values only - the rest
1033334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    * is owned by screen optionCache.
1043334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    */
1053334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   FREE(ctx->optionCache.values);
1063334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
1073334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   /* No particular reason to wait for command completion before
1083334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    * destroying a context, but it is probably worthwhile flushing it
1093334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    * to avoid having to add code elsewhere to cope with flushing a
1103334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    * partially destroyed context.
1113334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org    */
1123334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   ctx->st->flush(ctx->st, 0, NULL);
1133334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   ctx->st->destroy(ctx->st);
1143334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org
1153334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org   FREE(ctx);
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1183334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.orgGLboolean
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comdri_unbind_context(__DRIcontext * cPriv)
1203334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org{
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   struct dri_screen *screen = dri_screen(cPriv->driScreenPriv);
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   struct st_api *stapi = screen->st_api;
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   if (cPriv) {
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      struct dri_context *ctx = dri_context(cPriv);
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
12754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com      if (--ctx->bind_count == 0) {
12854924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com         if (ctx->st == stapi->get_current(stapi)) {
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            ctx->st->flush(ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            stapi->make_current(stapi, NULL, NULL, NULL);
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         }
1323334c3a1fa05b5ee0cab0f2f1ec7b19939737337mike@reedtribe.org      }
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
135   return GL_TRUE;
136}
137
138GLboolean
139dri_make_current(__DRIcontext * cPriv,
140		 __DRIdrawable * driDrawPriv,
141		 __DRIdrawable * driReadPriv)
142{
143   struct dri_screen *screen = dri_screen(cPriv->driScreenPriv);
144   struct st_api *stapi = screen->st_api;
145
146   if (cPriv) {
147      struct dri_context *ctx = dri_context(cPriv);
148      struct dri_drawable *draw = dri_drawable(driDrawPriv);
149      struct dri_drawable *read = dri_drawable(driReadPriv);
150      struct st_context_iface *old_st;
151
152      old_st = stapi->get_current(stapi);
153      if (old_st && old_st != ctx->st)
154	 old_st->flush(old_st, PIPE_FLUSH_RENDER_CACHE, NULL);
155
156      ++ctx->bind_count;
157
158      if (ctx->dPriv != driDrawPriv) {
159	 ctx->dPriv = driDrawPriv;
160         draw->texture_stamp = driDrawPriv->lastStamp - 1;
161      }
162      if (ctx->rPriv != driReadPriv) {
163	 ctx->rPriv = driReadPriv;
164         read->texture_stamp = driReadPriv->lastStamp - 1;
165      }
166
167      stapi->make_current(stapi, ctx->st, &draw->base, &read->base);
168   }
169   else {
170      stapi->make_current(stapi, NULL, NULL, NULL);
171   }
172
173   return GL_TRUE;
174}
175
176struct dri_context *
177dri_get_current(__DRIscreen *sPriv)
178{
179   struct dri_screen *screen = dri_screen(sPriv);
180   struct st_api *stapi = screen->st_api;
181   struct st_context_iface *st;
182
183   st = stapi->get_current(stapi);
184
185   return (struct dri_context *) (st) ? st->st_manager_private : NULL;
186}
187
188/* vim: set sw=3 ts=8 sts=3 expandtab: */
189