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