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