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