Path: blob/21.2-virgl/src/gallium/auxiliary/driver_rbug/rbug_screen.c
4561 views
/**************************************************************************1*2* Copyright 2010 VMware, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/262728#include "pipe/p_screen.h"29#include "pipe/p_state.h"30#include "util/u_memory.h"31#include "util/u_debug.h"32#include "util/simple_list.h"3334#include "rbug_public.h"35#include "rbug_screen.h"36#include "rbug_context.h"37#include "rbug_objects.h"3839DEBUG_GET_ONCE_BOOL_OPTION(rbug, "GALLIUM_RBUG", false)4041static void42rbug_screen_destroy(struct pipe_screen *_screen)43{44struct rbug_screen *rb_screen = rbug_screen(_screen);45struct pipe_screen *screen = rb_screen->screen;4647screen->destroy(screen);4849FREE(rb_screen);50}5152static const char *53rbug_screen_get_name(struct pipe_screen *_screen)54{55struct rbug_screen *rb_screen = rbug_screen(_screen);56struct pipe_screen *screen = rb_screen->screen;5758return screen->get_name(screen);59}6061static const char *62rbug_screen_get_vendor(struct pipe_screen *_screen)63{64struct rbug_screen *rb_screen = rbug_screen(_screen);65struct pipe_screen *screen = rb_screen->screen;6667return screen->get_vendor(screen);68}6970static const char *71rbug_screen_get_device_vendor(struct pipe_screen *_screen)72{73struct rbug_screen *rb_screen = rbug_screen(_screen);74struct pipe_screen *screen = rb_screen->screen;7576return screen->get_device_vendor(screen);77}7879static const void *80rbug_screen_get_compiler_options(struct pipe_screen *_screen,81enum pipe_shader_ir ir,82enum pipe_shader_type shader)83{84struct pipe_screen *screen = rbug_screen(_screen)->screen;8586return screen->get_compiler_options(screen, ir, shader);87}8889static struct disk_cache *90rbug_screen_get_disk_shader_cache(struct pipe_screen *_screen)91{92struct pipe_screen *screen = rbug_screen(_screen)->screen;9394return screen->get_disk_shader_cache(screen);95}9697static int98rbug_screen_get_param(struct pipe_screen *_screen,99enum pipe_cap param)100{101struct rbug_screen *rb_screen = rbug_screen(_screen);102struct pipe_screen *screen = rb_screen->screen;103104return screen->get_param(screen,105param);106}107108static int109rbug_screen_get_shader_param(struct pipe_screen *_screen,110enum pipe_shader_type shader,111enum pipe_shader_cap param)112{113struct rbug_screen *rb_screen = rbug_screen(_screen);114struct pipe_screen *screen = rb_screen->screen;115116return screen->get_shader_param(screen, shader,117param);118}119120static float121rbug_screen_get_paramf(struct pipe_screen *_screen,122enum pipe_capf param)123{124struct rbug_screen *rb_screen = rbug_screen(_screen);125struct pipe_screen *screen = rb_screen->screen;126127return screen->get_paramf(screen,128param);129}130131static bool132rbug_screen_is_format_supported(struct pipe_screen *_screen,133enum pipe_format format,134enum pipe_texture_target target,135unsigned sample_count,136unsigned storage_sample_count,137unsigned tex_usage)138{139struct rbug_screen *rb_screen = rbug_screen(_screen);140struct pipe_screen *screen = rb_screen->screen;141142return screen->is_format_supported(screen,143format,144target,145sample_count,146storage_sample_count,147tex_usage);148}149150static void151rbug_screen_query_dmabuf_modifiers(struct pipe_screen *_screen,152enum pipe_format format, int max,153uint64_t *modifiers,154unsigned int *external_only, int *count)155{156struct rbug_screen *rb_screen = rbug_screen(_screen);157struct pipe_screen *screen = rb_screen->screen;158159screen->query_dmabuf_modifiers(screen,160format,161max,162modifiers,163external_only,164count);165}166167static bool168rbug_screen_is_dmabuf_modifier_supported(struct pipe_screen *_screen,169uint64_t modifier,170enum pipe_format format,171bool *external_only)172{173struct rbug_screen *rb_screen = rbug_screen(_screen);174struct pipe_screen *screen = rb_screen->screen;175176return screen->is_dmabuf_modifier_supported(screen,177modifier,178format,179external_only);180}181182static unsigned int183rbug_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen,184uint64_t modifier,185enum pipe_format format)186{187struct rbug_screen *rb_screen = rbug_screen(_screen);188struct pipe_screen *screen = rb_screen->screen;189190return screen->get_dmabuf_modifier_planes(screen, modifier, format);191}192193static struct pipe_context *194rbug_screen_context_create(struct pipe_screen *_screen,195void *priv, unsigned flags)196{197struct rbug_screen *rb_screen = rbug_screen(_screen);198struct pipe_screen *screen = rb_screen->screen;199struct pipe_context *result;200201result = screen->context_create(screen, priv, flags);202if (result)203return rbug_context_create(_screen, result);204return NULL;205}206207static bool208rbug_screen_can_create_resource(struct pipe_screen *_screen,209const struct pipe_resource *templat)210{211struct rbug_screen *rb_screen = rbug_screen(_screen);212struct pipe_screen *screen = rb_screen->screen;213214return screen->can_create_resource(screen,215templat);216}217218static struct pipe_resource *219rbug_screen_resource_create(struct pipe_screen *_screen,220const struct pipe_resource *templat)221{222struct rbug_screen *rb_screen = rbug_screen(_screen);223struct pipe_screen *screen = rb_screen->screen;224struct pipe_resource *result;225226result = screen->resource_create(screen,227templat);228229if (result)230return rbug_resource_create(rb_screen, result);231return NULL;232}233234static struct pipe_resource *235rbug_screen_resource_create_with_modifiers(struct pipe_screen *_screen,236const struct pipe_resource *templat,237const uint64_t *modifiers, int count)238{239struct rbug_screen *rb_screen = rbug_screen(_screen);240struct pipe_screen *screen = rb_screen->screen;241struct pipe_resource *result;242243result = screen->resource_create_with_modifiers(screen,244templat,245modifiers,246count);247248if (result)249return rbug_resource_create(rb_screen, result);250return NULL;251}252253static struct pipe_resource *254rbug_screen_resource_from_handle(struct pipe_screen *_screen,255const struct pipe_resource *templ,256struct winsys_handle *handle,257unsigned usage)258{259struct rbug_screen *rb_screen = rbug_screen(_screen);260struct pipe_screen *screen = rb_screen->screen;261struct pipe_resource *result;262263result = screen->resource_from_handle(screen, templ, handle, usage);264265result = rbug_resource_create(rbug_screen(_screen), result);266267return result;268}269270static bool271rbug_screen_check_resource_capability(struct pipe_screen *_screen,272struct pipe_resource *_resource,273unsigned bind)274{275struct rbug_screen *rb_screen = rbug_screen(_screen);276struct rbug_resource *rb_resource = rbug_resource(_resource);277struct pipe_screen *screen = rb_screen->screen;278struct pipe_resource *resource = rb_resource->resource;279280return screen->check_resource_capability(screen, resource, bind);281}282283static bool284rbug_screen_resource_get_handle(struct pipe_screen *_screen,285struct pipe_context *_pipe,286struct pipe_resource *_resource,287struct winsys_handle *handle,288unsigned usage)289{290struct rbug_screen *rb_screen = rbug_screen(_screen);291struct rbug_context *rb_pipe = rbug_context(_pipe);292struct rbug_resource *rb_resource = rbug_resource(_resource);293struct pipe_screen *screen = rb_screen->screen;294struct pipe_resource *resource = rb_resource->resource;295296return screen->resource_get_handle(screen, rb_pipe ? rb_pipe->pipe : NULL,297resource, handle, usage);298}299300static bool301rbug_screen_resource_get_param(struct pipe_screen *_screen,302struct pipe_context *_pipe,303struct pipe_resource *_resource,304unsigned plane,305unsigned layer,306unsigned level,307enum pipe_resource_param param,308unsigned handle_usage,309uint64_t *value)310{311struct rbug_screen *rb_screen = rbug_screen(_screen);312struct rbug_context *rb_pipe = rbug_context(_pipe);313struct rbug_resource *rb_resource = rbug_resource(_resource);314struct pipe_screen *screen = rb_screen->screen;315struct pipe_resource *resource = rb_resource->resource;316317return screen->resource_get_param(screen, rb_pipe ? rb_pipe->pipe : NULL,318resource, plane, layer, level, param,319handle_usage, value);320}321322323static void324rbug_screen_resource_get_info(struct pipe_screen *_screen,325struct pipe_resource *_resource,326unsigned *stride,327unsigned *offset)328{329struct rbug_screen *rb_screen = rbug_screen(_screen);330struct rbug_resource *rb_resource = rbug_resource(_resource);331struct pipe_screen *screen = rb_screen->screen;332struct pipe_resource *resource = rb_resource->resource;333334screen->resource_get_info(screen, resource, stride, offset);335}336337static void338rbug_screen_resource_changed(struct pipe_screen *_screen,339struct pipe_resource *_resource)340{341struct rbug_screen *rb_screen = rbug_screen(_screen);342struct rbug_resource *rb_resource = rbug_resource(_resource);343struct pipe_screen *screen = rb_screen->screen;344struct pipe_resource *resource = rb_resource->resource;345346screen->resource_changed(screen, resource);347}348349static void350rbug_screen_resource_destroy(struct pipe_screen *screen,351struct pipe_resource *_resource)352{353rbug_resource_destroy(rbug_resource(_resource));354}355356static void357rbug_screen_flush_frontbuffer(struct pipe_screen *_screen,358struct pipe_context *_ctx,359struct pipe_resource *_resource,360unsigned level, unsigned layer,361void *context_private, struct pipe_box *sub_box)362{363struct rbug_screen *rb_screen = rbug_screen(_screen);364struct rbug_resource *rb_resource = rbug_resource(_resource);365struct pipe_screen *screen = rb_screen->screen;366struct pipe_resource *resource = rb_resource->resource;367struct pipe_context *ctx = _ctx ? rbug_context(_ctx)->pipe : NULL;368369screen->flush_frontbuffer(screen,370ctx,371resource,372level, layer,373context_private, sub_box);374}375376static void377rbug_screen_fence_reference(struct pipe_screen *_screen,378struct pipe_fence_handle **ptr,379struct pipe_fence_handle *fence)380{381struct rbug_screen *rb_screen = rbug_screen(_screen);382struct pipe_screen *screen = rb_screen->screen;383384screen->fence_reference(screen,385ptr,386fence);387}388389static bool390rbug_screen_fence_finish(struct pipe_screen *_screen,391struct pipe_context *_ctx,392struct pipe_fence_handle *fence,393uint64_t timeout)394{395struct rbug_screen *rb_screen = rbug_screen(_screen);396struct pipe_screen *screen = rb_screen->screen;397struct pipe_context *ctx = _ctx ? rbug_context(_ctx)->pipe : NULL;398399return screen->fence_finish(screen, ctx, fence, timeout);400}401402static int403rbug_screen_fence_get_fd(struct pipe_screen *_screen,404struct pipe_fence_handle *fence)405{406struct rbug_screen *rb_screen = rbug_screen(_screen);407struct pipe_screen *screen = rb_screen->screen;408409return screen->fence_get_fd(screen, fence);410}411412static void413rbug_screen_finalize_nir(struct pipe_screen *_screen, void *nir, bool optimize)414{415struct pipe_screen *screen = rbug_screen(_screen)->screen;416417screen->finalize_nir(screen, nir, optimize);418}419420bool421rbug_enabled()422{423return debug_get_option_rbug();424}425426struct pipe_screen *427rbug_screen_create(struct pipe_screen *screen)428{429struct rbug_screen *rb_screen;430431if (!debug_get_option_rbug())432return screen;433434rb_screen = CALLOC_STRUCT(rbug_screen);435if (!rb_screen)436return screen;437438(void) mtx_init(&rb_screen->list_mutex, mtx_plain);439make_empty_list(&rb_screen->contexts);440make_empty_list(&rb_screen->resources);441make_empty_list(&rb_screen->surfaces);442make_empty_list(&rb_screen->transfers);443444#define SCR_INIT(_member) \445rb_screen->base._member = screen->_member ? rbug_screen_##_member : NULL446447rb_screen->base.destroy = rbug_screen_destroy;448rb_screen->base.get_name = rbug_screen_get_name;449rb_screen->base.get_vendor = rbug_screen_get_vendor;450SCR_INIT(get_compiler_options);451SCR_INIT(get_disk_shader_cache);452rb_screen->base.get_device_vendor = rbug_screen_get_device_vendor;453rb_screen->base.get_param = rbug_screen_get_param;454rb_screen->base.get_shader_param = rbug_screen_get_shader_param;455rb_screen->base.get_paramf = rbug_screen_get_paramf;456rb_screen->base.is_format_supported = rbug_screen_is_format_supported;457SCR_INIT(query_dmabuf_modifiers);458SCR_INIT(is_dmabuf_modifier_supported);459SCR_INIT(get_dmabuf_modifier_planes);460rb_screen->base.context_create = rbug_screen_context_create;461SCR_INIT(can_create_resource);462rb_screen->base.resource_create = rbug_screen_resource_create;463SCR_INIT(resource_create_with_modifiers);464rb_screen->base.resource_from_handle = rbug_screen_resource_from_handle;465SCR_INIT(check_resource_capability);466rb_screen->base.resource_get_handle = rbug_screen_resource_get_handle;467SCR_INIT(resource_get_param);468SCR_INIT(resource_get_info);469SCR_INIT(resource_changed);470rb_screen->base.resource_destroy = rbug_screen_resource_destroy;471rb_screen->base.flush_frontbuffer = rbug_screen_flush_frontbuffer;472rb_screen->base.fence_reference = rbug_screen_fence_reference;473rb_screen->base.fence_finish = rbug_screen_fence_finish;474rb_screen->base.fence_get_fd = rbug_screen_fence_get_fd;475SCR_INIT(finalize_nir);476477rb_screen->screen = screen;478479rb_screen->private_context = screen->context_create(screen, NULL, 0);480if (!rb_screen->private_context)481goto err_free;482483rb_screen->rbug = rbug_start(rb_screen);484485if (!rb_screen->rbug)486goto err_context;487488return &rb_screen->base;489490err_context:491rb_screen->private_context->destroy(rb_screen->private_context);492err_free:493FREE(rb_screen);494return screen;495}496497498