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