10c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca/************************************************************************** 20c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * 30c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 40c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * All Rights Reserved. 50c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * 60c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 70c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * copy of this software and associated documentation files (the 80c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * "Software"), to deal in the Software without restriction, including 90c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 100c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 110c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * permit persons to whom the Software is furnished to do so, subject to 120c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * the following conditions: 130c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * 140c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * The above copyright notice and this permission notice (including the 150c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * next paragraph) shall be included in all copies or substantial portions 160c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * of the Software. 170c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * 180c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 190c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 200c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 210c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 220c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 230c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 240c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 250c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * 260c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca **************************************************************************/ 270c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 280c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca/** 290c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * \file 300c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * Allocate buffers from two alternative buffer providers. 310c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * 320c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca * \author Jose Fonseca <jrfonseca@tungstengraphics.com> 330c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca */ 340c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 350c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 360c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca#include "pipe/p_compiler.h" 37ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 384f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 390c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 400c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca#include "pb_buffer.h" 410c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca#include "pb_bufmgr.h" 420c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 430c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 440c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecastruct pb_alt_manager 450c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca{ 460c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_manager base; 470c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 480c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_manager *provider1; 490c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_manager *provider2; 500c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca}; 510c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 520c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 530c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecastatic INLINE struct pb_alt_manager * 540c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecapb_alt_manager(struct pb_manager *mgr) 550c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca{ 560c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca assert(mgr); 570c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca return (struct pb_alt_manager *)mgr; 580c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca} 590c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 600c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 610c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecastatic struct pb_buffer * 620c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecapb_alt_manager_create_buffer(struct pb_manager *_mgr, 632af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, 640c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca const struct pb_desc *desc) 650c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca{ 660c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_alt_manager *mgr = pb_alt_manager(_mgr); 670c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_buffer *buf; 680c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 690c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca buf = mgr->provider1->create_buffer(mgr->provider1, size, desc); 700c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca if(buf) 710c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca return buf; 720c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 730c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca buf = mgr->provider2->create_buffer(mgr->provider2, size, desc); 740c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca return buf; 750c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca} 760c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 770c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 780c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecastatic void 791672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecapb_alt_manager_flush(struct pb_manager *_mgr) 801672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{ 811672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca struct pb_alt_manager *mgr = pb_alt_manager(_mgr); 821672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 831672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca assert(mgr->provider1->flush); 841672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca if(mgr->provider1->flush) 851672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mgr->provider1->flush(mgr->provider1); 861672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 871672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca assert(mgr->provider2->flush); 881672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca if(mgr->provider2->flush) 891672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mgr->provider2->flush(mgr->provider2); 901672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca} 911672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 921672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 931672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void 940c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecapb_alt_manager_destroy(struct pb_manager *mgr) 950c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca{ 960c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca FREE(mgr); 970c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca} 980c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 990c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 1000c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecastruct pb_manager * 1010c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecapb_alt_manager_create(struct pb_manager *provider1, 1020c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_manager *provider2) 1030c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca{ 1040c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca struct pb_alt_manager *mgr; 1050c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 106ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca if(!provider1 || !provider2) 107ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca return NULL; 108ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca 1090c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca mgr = CALLOC_STRUCT(pb_alt_manager); 1100c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca if (!mgr) 1110c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca return NULL; 1120c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 1130c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca mgr->base.destroy = pb_alt_manager_destroy; 1140c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca mgr->base.create_buffer = pb_alt_manager_create_buffer; 1151672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mgr->base.flush = pb_alt_manager_flush; 1160c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca mgr->provider1 = provider1; 1170c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca mgr->provider2 = provider2; 1180c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca 1190c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca return &mgr->base; 1200c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca} 121