12c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz/**************************************************************************
22c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz *
32c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * Copyright 2010 VMware, Inc.
42c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * All Rights Reserved.
52c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz *
62c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a
72c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * copy of this software and associated documentation files (the
82c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * "Software"), to deal in the Software without restriction, including
92c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * without limitation the rights to use, copy, modify, merge, publish,
102c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * distribute, sub license, and/or sell copies of the Software, and to
112c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * permit persons to whom the Software is furnished to do so, subject to
122c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * the following conditions:
132c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz *
142c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * The above copyright notice and this permission notice (including the
152c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * next paragraph) shall be included in all copies or substantial portions
162c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * of the Software.
172c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz *
182c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
192c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
202c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
212c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
222c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
232c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
242c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
252c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz *
262c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz **************************************************************************/
272c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
282c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
292c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "pipe/p_screen.h"
302c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "pipe/p_state.h"
312c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "util/u_memory.h"
322c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "util/u_debug.h"
332c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "util/u_simple_list.h"
342c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
352c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "rbug_public.h"
362c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "rbug_screen.h"
372c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "rbug_context.h"
382c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz#include "rbug_objects.h"
392c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
4092f88c746cc270e575aa13ce74debf5b21365fa1Brian PaulDEBUG_GET_ONCE_BOOL_OPTION(rbug, "GALLIUM_RBUG", FALSE)
412c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
422c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic void
432c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_destroy(struct pipe_screen *_screen)
442c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
452c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
462c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
472c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
482c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   screen->destroy(screen);
492c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
502c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   FREE(rb_screen);
512c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
522c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
532c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic const char *
542c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_get_name(struct pipe_screen *_screen)
552c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
562c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
572c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
582c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
592c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->get_name(screen);
602c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
612c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
622c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic const char *
632c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_get_vendor(struct pipe_screen *_screen)
642c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
652c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
662c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
672c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
682c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->get_vendor(screen);
692c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
702c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
712c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic int
722c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_get_param(struct pipe_screen *_screen,
732c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                      enum pipe_cap param)
742c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
752c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
762c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
772c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
782c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->get_param(screen,
792c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                            param);
802c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
812c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
82a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieristatic int
83a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbierirbug_screen_get_shader_param(struct pipe_screen *_screen,
844f2f02b7d6b0e687cc5d775d00662c309cc20da7Vinson Lee                      unsigned shader, enum pipe_shader_cap param)
85a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri{
86a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   struct rbug_screen *rb_screen = rbug_screen(_screen);
87a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   struct pipe_screen *screen = rb_screen->screen;
88a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
89a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   return screen->get_shader_param(screen, shader,
90a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri                            param);
91a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri}
92a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri
932c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic float
942c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_get_paramf(struct pipe_screen *_screen,
95bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák                       enum pipe_capf param)
962c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
972c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
982c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
992c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1002c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->get_paramf(screen,
1012c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                             param);
1022c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1032c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1042c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic boolean
1052c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_is_format_supported(struct pipe_screen *_screen,
1062c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                enum pipe_format format,
1072c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                enum pipe_texture_target target,
108e4f4489e3fc0b36d72821b55794fb843b2b7fa5fRoland Scheidegger                                unsigned sample_count,
109e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                unsigned tex_usage)
1102c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1112c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
1122c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
1132c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1142c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->is_format_supported(screen,
1152c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                      format,
1162c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                      target,
117e4f4489e3fc0b36d72821b55794fb843b2b7fa5fRoland Scheidegger                                      sample_count,
118e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                      tex_usage);
1192c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1202c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1212c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic struct pipe_context *
1222c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_context_create(struct pipe_screen *_screen,
1232c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                           void *priv)
1242c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1252c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
1262c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
1272c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_context *result;
1282c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1292c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   result = screen->context_create(screen, priv);
1302c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   if (result)
1312c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz      return rbug_context_create(_screen, result);
1322c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return NULL;
1332c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1342c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1352c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic struct pipe_resource *
1362c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_resource_create(struct pipe_screen *_screen,
1372c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                            const struct pipe_resource *templat)
1382c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1392c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
1402c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
1412c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_resource *result;
1422c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1432c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   result = screen->resource_create(screen,
1442c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                    templat);
1452c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1462c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   if (result)
1472c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz      return rbug_resource_create(rb_screen, result);
1482c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return NULL;
1492c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1502c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1512c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic struct pipe_resource *
1522c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_resource_from_handle(struct pipe_screen *_screen,
1532c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                 const struct pipe_resource *templ,
1542c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                 struct winsys_handle *handle)
1552c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1562c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
1572c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
1582c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_resource *result;
1592c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1602c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   result = screen->resource_from_handle(screen, templ, handle);
1612c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1622c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   result = rbug_resource_create(rbug_screen(_screen), result);
1632c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1642c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return result;
1652c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1662c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1672c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic boolean
1682c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_resource_get_handle(struct pipe_screen *_screen,
1692c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                struct pipe_resource *_resource,
1702c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                                struct winsys_handle *handle)
1712c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1722c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
1732c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_resource *rb_resource = rbug_resource(_resource);
1742c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
1752c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_resource *resource = rb_resource->resource;
1762c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1772c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->resource_get_handle(screen, resource, handle);
1782c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1792c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1802c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1812c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1822c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic void
1832c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_resource_destroy(struct pipe_screen *screen,
1842c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                             struct pipe_resource *_resource)
1852c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1862c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rbug_resource_destroy(rbug_resource(_resource));
1872c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
1882c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
1892c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic void
1902c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_flush_frontbuffer(struct pipe_screen *_screen,
1914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              struct pipe_resource *_resource,
1924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              unsigned level, unsigned layer,
1932c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                              void *context_private)
1942c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
1952c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
1964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct rbug_resource *rb_resource = rbug_resource(_resource);
1972c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
1984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_resource *resource = rb_resource->resource;
1992c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2002c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   screen->flush_frontbuffer(screen,
2014c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                             resource,
2024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                             level, layer,
2032c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                             context_private);
2042c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
2052c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2062c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstatic void
2072c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_fence_reference(struct pipe_screen *_screen,
2082c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                            struct pipe_fence_handle **ptr,
2092c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                            struct pipe_fence_handle *fence)
2102c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
2112c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
2122c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
2132c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2142c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   screen->fence_reference(screen,
2152c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                           ptr,
2162c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                           fence);
2172c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
2182c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
219bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšákstatic boolean
2202c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_fence_signalled(struct pipe_screen *_screen,
221bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák                            struct pipe_fence_handle *fence)
2222c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
2232c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
2242c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
2252c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2262c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->fence_signalled(screen,
227bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák                                  fence);
2282c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
2292c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
230bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšákstatic boolean
2312c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_fence_finish(struct pipe_screen *_screen,
2322c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                         struct pipe_fence_handle *fence,
233b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                         uint64_t timeout)
2342c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
2352c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen = rbug_screen(_screen);
2362c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct pipe_screen *screen = rb_screen->screen;
2372c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2382c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen->fence_finish(screen,
2392c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz                               fence,
240b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                               timeout);
2412c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
2422c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
24353cbb81576671d6d39e6a353e79ebda2c512d735Jakob Bornecrantzboolean
24453cbb81576671d6d39e6a353e79ebda2c512d735Jakob Bornecrantzrbug_enabled()
24553cbb81576671d6d39e6a353e79ebda2c512d735Jakob Bornecrantz{
24653cbb81576671d6d39e6a353e79ebda2c512d735Jakob Bornecrantz   return debug_get_option_rbug();
24753cbb81576671d6d39e6a353e79ebda2c512d735Jakob Bornecrantz}
24853cbb81576671d6d39e6a353e79ebda2c512d735Jakob Bornecrantz
2492c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzstruct pipe_screen *
2502c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzrbug_screen_create(struct pipe_screen *screen)
2512c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz{
2522c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   struct rbug_screen *rb_screen;
2532c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2542c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   if (!debug_get_option_rbug())
2552c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz      return screen;
2562c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2572c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen = CALLOC_STRUCT(rbug_screen);
2582c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   if (!rb_screen)
2592c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz      return screen;
2602c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2612c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   pipe_mutex_init(rb_screen->list_mutex);
2622c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   make_empty_list(&rb_screen->contexts);
2632c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   make_empty_list(&rb_screen->resources);
2642c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   make_empty_list(&rb_screen->surfaces);
2652c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   make_empty_list(&rb_screen->transfers);
2662c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2672c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.destroy = rbug_screen_destroy;
2682c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.get_name = rbug_screen_get_name;
2692c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.get_vendor = rbug_screen_get_vendor;
2702c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.get_param = rbug_screen_get_param;
271a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri   rb_screen->base.get_shader_param = rbug_screen_get_shader_param;
2722c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.get_paramf = rbug_screen_get_paramf;
2732c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.is_format_supported = rbug_screen_is_format_supported;
2742c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.context_create = rbug_screen_context_create;
2752c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.resource_create = rbug_screen_resource_create;
2762c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.resource_from_handle = rbug_screen_resource_from_handle;
2772c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.resource_get_handle = rbug_screen_resource_get_handle;
2782c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.resource_destroy = rbug_screen_resource_destroy;
2792c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.flush_frontbuffer = rbug_screen_flush_frontbuffer;
2802c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.fence_reference = rbug_screen_fence_reference;
2812c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.fence_signalled = rbug_screen_fence_signalled;
2822c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->base.fence_finish = rbug_screen_fence_finish;
2832c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2842c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->screen = screen;
2852c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2862c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->private_context = screen->context_create(screen, NULL);
2872c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   if (!rb_screen->private_context)
2882c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz      goto err_free;
2892c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2902c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->rbug = rbug_start(rb_screen);
2912c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2922c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   if (!rb_screen->rbug)
2932c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz      goto err_context;
2942c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2952c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return &rb_screen->base;
2962c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz
2972c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzerr_context:
2982c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   rb_screen->private_context->destroy(rb_screen->private_context);
2992c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantzerr_free:
3002c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   FREE(rb_screen);
3012c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz   return screen;
3022c3fb4ecce27f4c2468892241216a06fc77143c4Jakob Bornecrantz}
303