Path: blob/21.2-virgl/src/gallium/auxiliary/driver_trace/tr_screen.c
4565 views
/**************************************************************************1*2* Copyright 2008 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**************************************************************************/2627#include "util/format/u_format.h"28#include "util/u_memory.h"29#include "util/hash_table.h"30#include "util/simple_list.h"3132#include "tr_dump.h"33#include "tr_dump_defines.h"34#include "tr_dump_state.h"35#include "tr_texture.h"36#include "tr_context.h"37#include "tr_screen.h"38#include "tr_public.h"394041static bool trace = false;42static struct hash_table *trace_screens;4344static const char *45trace_screen_get_name(struct pipe_screen *_screen)46{47struct trace_screen *tr_scr = trace_screen(_screen);48struct pipe_screen *screen = tr_scr->screen;49const char *result;5051trace_dump_call_begin("pipe_screen", "get_name");5253trace_dump_arg(ptr, screen);5455result = screen->get_name(screen);5657trace_dump_ret(string, result);5859trace_dump_call_end();6061return result;62}636465static const char *66trace_screen_get_vendor(struct pipe_screen *_screen)67{68struct trace_screen *tr_scr = trace_screen(_screen);69struct pipe_screen *screen = tr_scr->screen;70const char *result;7172trace_dump_call_begin("pipe_screen", "get_vendor");7374trace_dump_arg(ptr, screen);7576result = screen->get_vendor(screen);7778trace_dump_ret(string, result);7980trace_dump_call_end();8182return result;83}848586static const char *87trace_screen_get_device_vendor(struct pipe_screen *_screen)88{89struct trace_screen *tr_scr = trace_screen(_screen);90struct pipe_screen *screen = tr_scr->screen;91const char *result;9293trace_dump_call_begin("pipe_screen", "get_device_vendor");9495trace_dump_arg(ptr, screen);9697result = screen->get_device_vendor(screen);9899trace_dump_ret(string, result);100101trace_dump_call_end();102103return result;104}105106107static const void *108trace_screen_get_compiler_options(struct pipe_screen *_screen,109enum pipe_shader_ir ir,110enum pipe_shader_type shader)111{112struct trace_screen *tr_scr = trace_screen(_screen);113struct pipe_screen *screen = tr_scr->screen;114115return screen->get_compiler_options(screen, ir, shader);116}117118119static struct disk_cache *120trace_screen_get_disk_shader_cache(struct pipe_screen *_screen)121{122struct trace_screen *tr_scr = trace_screen(_screen);123struct pipe_screen *screen = tr_scr->screen;124125trace_dump_call_begin("pipe_screen", "get_disk_shader_cache");126127trace_dump_arg(ptr, screen);128129struct disk_cache *result = screen->get_disk_shader_cache(screen);130131trace_dump_ret(ptr, result);132133trace_dump_call_end();134135return result;136}137138139static int140trace_screen_get_param(struct pipe_screen *_screen,141enum pipe_cap param)142{143struct trace_screen *tr_scr = trace_screen(_screen);144struct pipe_screen *screen = tr_scr->screen;145int result;146147trace_dump_call_begin("pipe_screen", "get_param");148149trace_dump_arg(ptr, screen);150trace_dump_arg(int, param);151152result = screen->get_param(screen, param);153154trace_dump_ret(int, result);155156trace_dump_call_end();157158return result;159}160161162static int163trace_screen_get_shader_param(struct pipe_screen *_screen,164enum pipe_shader_type shader,165enum pipe_shader_cap param)166{167struct trace_screen *tr_scr = trace_screen(_screen);168struct pipe_screen *screen = tr_scr->screen;169int result;170171trace_dump_call_begin("pipe_screen", "get_shader_param");172173trace_dump_arg(ptr, screen);174trace_dump_arg(uint, shader);175trace_dump_arg(int, param);176177result = screen->get_shader_param(screen, shader, param);178179trace_dump_ret(int, result);180181trace_dump_call_end();182183return result;184}185186187static float188trace_screen_get_paramf(struct pipe_screen *_screen,189enum pipe_capf param)190{191struct trace_screen *tr_scr = trace_screen(_screen);192struct pipe_screen *screen = tr_scr->screen;193float result;194195trace_dump_call_begin("pipe_screen", "get_paramf");196197trace_dump_arg(ptr, screen);198trace_dump_arg(int, param);199200result = screen->get_paramf(screen, param);201202trace_dump_ret(float, result);203204trace_dump_call_end();205206return result;207}208209210static int211trace_screen_get_compute_param(struct pipe_screen *_screen,212enum pipe_shader_ir ir_type,213enum pipe_compute_cap param, void *data)214{215struct trace_screen *tr_scr = trace_screen(_screen);216struct pipe_screen *screen = tr_scr->screen;217int result;218219trace_dump_call_begin("pipe_screen", "get_compute_param");220221trace_dump_arg(ptr, screen);222trace_dump_arg(int, ir_type);223trace_dump_arg(int, param);224trace_dump_arg(ptr, data);225226result = screen->get_compute_param(screen, ir_type, param, data);227228trace_dump_ret(int, result);229230trace_dump_call_end();231232return result;233}234235236static bool237trace_screen_is_format_supported(struct pipe_screen *_screen,238enum pipe_format format,239enum pipe_texture_target target,240unsigned sample_count,241unsigned storage_sample_count,242unsigned tex_usage)243{244struct trace_screen *tr_scr = trace_screen(_screen);245struct pipe_screen *screen = tr_scr->screen;246bool result;247248trace_dump_call_begin("pipe_screen", "is_format_supported");249250trace_dump_arg(ptr, screen);251trace_dump_arg(format, format);252trace_dump_arg(int, target);253trace_dump_arg(uint, sample_count);254trace_dump_arg(uint, tex_usage);255256result = screen->is_format_supported(screen, format, target, sample_count,257storage_sample_count, tex_usage);258259trace_dump_ret(bool, result);260261trace_dump_call_end();262263return result;264}265266static void267trace_context_replace_buffer_storage(struct pipe_context *_pipe,268struct pipe_resource *dst,269struct pipe_resource *src,270unsigned num_rebinds,271uint32_t rebind_mask,272unsigned delete_buffer_id)273{274struct trace_context *tr_ctx = trace_context(_pipe);275struct pipe_context *pipe = tr_ctx->pipe;276277trace_dump_call_begin("pipe_context", "replace_buffer_storage");278279trace_dump_arg(ptr, pipe);280trace_dump_arg(ptr, dst);281trace_dump_arg(ptr, src);282trace_dump_arg(uint, num_rebinds);283trace_dump_arg(uint, rebind_mask);284trace_dump_arg(uint, delete_buffer_id);285trace_dump_call_end();286287tr_ctx->replace_buffer_storage(pipe, dst, src, num_rebinds, rebind_mask, delete_buffer_id);288}289290static struct pipe_fence_handle *291trace_context_create_fence(struct pipe_context *_pipe, struct tc_unflushed_batch_token *token)292{293struct trace_context *tr_ctx = trace_context(_pipe);294struct pipe_context *pipe = tr_ctx->pipe;295296trace_dump_call_begin("pipe_context", "create_fence");297298trace_dump_arg(ptr, pipe);299trace_dump_arg(ptr, token);300301struct pipe_fence_handle *ret = tr_ctx->create_fence(pipe, token);302trace_dump_ret(ptr, ret);303trace_dump_call_end();304305return ret;306}307308static bool309trace_context_is_resource_busy(struct pipe_screen *_screen,310struct pipe_resource *resource,311unsigned usage)312{313struct trace_screen *tr_scr = trace_screen(_screen);314struct pipe_screen *screen = tr_scr->screen;315bool result;316317trace_dump_call_begin("pipe_screen", "is_resource_busy");318319trace_dump_arg(ptr, screen);320trace_dump_arg(ptr, resource);321trace_dump_arg(uint, usage);322323result = tr_scr->is_resource_busy(screen, resource, usage);324325trace_dump_ret(bool, result);326327trace_dump_call_end();328329return result;330}331332struct pipe_context *333trace_context_create_threaded(struct pipe_screen *screen, struct pipe_context *pipe,334tc_replace_buffer_storage_func *replace_buffer,335tc_create_fence_func *create_fence,336tc_is_resource_busy *is_resource_busy)337{338if (!trace_screens)339return pipe;340341struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);342if (!he)343return pipe;344struct trace_screen *tr_scr = trace_screen(he->data);345346if (tr_scr->trace_tc)347return pipe;348349struct pipe_context *ctx = trace_context_create(tr_scr, pipe);350if (!ctx)351return pipe;352353struct trace_context *tr_ctx = trace_context(ctx);354tr_ctx->replace_buffer_storage = *replace_buffer;355tr_ctx->create_fence = *create_fence;356tr_scr->is_resource_busy = *is_resource_busy;357tr_ctx->threaded = true;358*replace_buffer = trace_context_replace_buffer_storage;359if (*create_fence)360*create_fence = trace_context_create_fence;361if (*is_resource_busy)362*is_resource_busy = trace_context_is_resource_busy;363return ctx;364}365366static struct pipe_context *367trace_screen_context_create(struct pipe_screen *_screen, void *priv,368unsigned flags)369{370struct trace_screen *tr_scr = trace_screen(_screen);371struct pipe_screen *screen = tr_scr->screen;372struct pipe_context *result;373374result = screen->context_create(screen, priv, flags);375376trace_dump_call_begin("pipe_screen", "context_create");377378trace_dump_arg(ptr, screen);379trace_dump_arg(ptr, priv);380trace_dump_arg(uint, flags);381382trace_dump_ret(ptr, result);383384trace_dump_call_end();385386if (result && (tr_scr->trace_tc || result->draw_vbo != tc_draw_vbo))387result = trace_context_create(tr_scr, result);388389return result;390}391392393static void394trace_screen_flush_frontbuffer(struct pipe_screen *_screen,395struct pipe_context *_pipe,396struct pipe_resource *resource,397unsigned level, unsigned layer,398void *context_private,399struct pipe_box *sub_box)400{401struct trace_screen *tr_scr = trace_screen(_screen);402struct pipe_screen *screen = tr_scr->screen;403struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;404405trace_dump_call_begin("pipe_screen", "flush_frontbuffer");406407trace_dump_arg(ptr, screen);408trace_dump_arg(ptr, resource);409trace_dump_arg(uint, level);410trace_dump_arg(uint, layer);411/* XXX: hide, as there is nothing we can do with this412trace_dump_arg(ptr, context_private);413*/414415trace_dump_call_end();416417screen->flush_frontbuffer(screen, pipe, resource, level, layer, context_private, sub_box);418}419420421static void422trace_screen_get_driver_uuid(struct pipe_screen *_screen, char *uuid)423{424struct pipe_screen *screen = trace_screen(_screen)->screen;425426trace_dump_call_begin("pipe_screen", "get_driver_uuid");427trace_dump_arg(ptr, screen);428429screen->get_driver_uuid(screen, uuid);430431trace_dump_ret(string, uuid);432trace_dump_call_end();433}434435static void436trace_screen_get_device_uuid(struct pipe_screen *_screen, char *uuid)437{438struct pipe_screen *screen = trace_screen(_screen)->screen;439440trace_dump_call_begin("pipe_screen", "get_device_uuid");441trace_dump_arg(ptr, screen);442443screen->get_device_uuid(screen, uuid);444445trace_dump_ret(string, uuid);446trace_dump_call_end();447}448449450/********************************************************************451* texture452*/453454static void *455trace_screen_map_memory(struct pipe_screen *_screen,456struct pipe_memory_allocation *pmem)457{458struct trace_screen *tr_scr = trace_screen(_screen);459struct pipe_screen *screen = tr_scr->screen;460void *result;461462trace_dump_call_begin("pipe_screen", "map_memory");463464trace_dump_arg(ptr, screen);465trace_dump_arg(ptr, pmem);466467result = screen->map_memory(screen, pmem);468469trace_dump_ret(ptr, result);470471trace_dump_call_end();472473return result;474}475476static void477trace_screen_unmap_memory(struct pipe_screen *_screen,478struct pipe_memory_allocation *pmem)479{480struct trace_screen *tr_scr = trace_screen(_screen);481struct pipe_screen *screen = tr_scr->screen;482483trace_dump_call_begin("pipe_screen", "unmap_memory");484485trace_dump_arg(ptr, screen);486trace_dump_arg(ptr, pmem);487488screen->unmap_memory(screen, pmem);489490491trace_dump_call_end();492}493494static struct pipe_memory_allocation *495trace_screen_allocate_memory(struct pipe_screen *_screen,496uint64_t size)497{498struct trace_screen *tr_scr = trace_screen(_screen);499struct pipe_screen *screen = tr_scr->screen;500struct pipe_memory_allocation *result;501502trace_dump_call_begin("pipe_screen", "allocate_memory");503504trace_dump_arg(ptr, screen);505trace_dump_arg(uint, size);506507result = screen->allocate_memory(screen, size);508509trace_dump_ret(ptr, result);510511trace_dump_call_end();512513return result;514}515516static void517trace_screen_free_memory(struct pipe_screen *_screen,518struct pipe_memory_allocation *pmem)519{520struct trace_screen *tr_scr = trace_screen(_screen);521struct pipe_screen *screen = tr_scr->screen;522523trace_dump_call_begin("pipe_screen", "free_memory");524525trace_dump_arg(ptr, screen);526trace_dump_arg(ptr, pmem);527528screen->free_memory(screen, pmem);529530531trace_dump_call_end();532}533534static bool535trace_screen_resource_bind_backing(struct pipe_screen *_screen,536struct pipe_resource *resource,537struct pipe_memory_allocation *pmem,538uint64_t offset)539{540struct trace_screen *tr_scr = trace_screen(_screen);541struct pipe_screen *screen = tr_scr->screen;542bool result;543544trace_dump_call_begin("pipe_screen", "resource_bind_backing");545546trace_dump_arg(ptr, screen);547trace_dump_arg(ptr, resource);548trace_dump_arg(ptr, pmem);549trace_dump_arg(uint, offset);550551result = screen->resource_bind_backing(screen, resource, pmem, offset);552553trace_dump_ret(bool, result);554555trace_dump_call_end();556557return result;558}559560static struct pipe_resource *561trace_screen_resource_create_unbacked(struct pipe_screen *_screen,562const struct pipe_resource *templat,563uint64_t *size_required)564{565struct trace_screen *tr_scr = trace_screen(_screen);566struct pipe_screen *screen = tr_scr->screen;567struct pipe_resource *result;568569trace_dump_call_begin("pipe_screen", "resource_create_unbacked");570571trace_dump_arg(ptr, screen);572trace_dump_arg(resource_template, templat);573574result = screen->resource_create_unbacked(screen, templat, size_required);575576trace_dump_ret_begin();577trace_dump_uint(*size_required);578trace_dump_ret_end();579trace_dump_ret(ptr, result);580581trace_dump_call_end();582583if (result)584result->screen = _screen;585return result;586}587588static struct pipe_resource *589trace_screen_resource_create(struct pipe_screen *_screen,590const struct pipe_resource *templat)591{592struct trace_screen *tr_scr = trace_screen(_screen);593struct pipe_screen *screen = tr_scr->screen;594struct pipe_resource *result;595596trace_dump_call_begin("pipe_screen", "resource_create");597598trace_dump_arg(ptr, screen);599trace_dump_arg(resource_template, templat);600601result = screen->resource_create(screen, templat);602603trace_dump_ret(ptr, result);604605trace_dump_call_end();606607if (result)608result->screen = _screen;609return result;610}611612static struct pipe_resource *613trace_screen_resource_create_with_modifiers(struct pipe_screen *_screen, const struct pipe_resource *templat,614const uint64_t *modifiers, int modifiers_count)615{616struct trace_screen *tr_scr = trace_screen(_screen);617struct pipe_screen *screen = tr_scr->screen;618struct pipe_resource *result;619620trace_dump_call_begin("pipe_screen", "resource_create_with_modifiers");621622trace_dump_arg(ptr, screen);623trace_dump_arg(resource_template, templat);624trace_dump_arg_array(uint, modifiers, modifiers_count);625626result = screen->resource_create_with_modifiers(screen, templat, modifiers, modifiers_count);627628trace_dump_ret(ptr, result);629630trace_dump_call_end();631632if (result)633result->screen = _screen;634return result;635}636637static struct pipe_resource *638trace_screen_resource_from_handle(struct pipe_screen *_screen,639const struct pipe_resource *templ,640struct winsys_handle *handle,641unsigned usage)642{643struct trace_screen *tr_screen = trace_screen(_screen);644struct pipe_screen *screen = tr_screen->screen;645struct pipe_resource *result;646647/* TODO trace call */648649result = screen->resource_from_handle(screen, templ, handle, usage);650651if (result)652result->screen = _screen;653return result;654}655656static bool657trace_screen_check_resource_capability(struct pipe_screen *_screen,658struct pipe_resource *resource,659unsigned bind)660{661struct pipe_screen *screen = trace_screen(_screen)->screen;662663return screen->check_resource_capability(screen, resource, bind);664}665666static bool667trace_screen_resource_get_handle(struct pipe_screen *_screen,668struct pipe_context *_pipe,669struct pipe_resource *resource,670struct winsys_handle *handle,671unsigned usage)672{673struct trace_screen *tr_screen = trace_screen(_screen);674struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;675struct pipe_screen *screen = tr_screen->screen;676677/* TODO trace call */678679return screen->resource_get_handle(screen, pipe,680resource, handle, usage);681}682683static bool684trace_screen_resource_get_param(struct pipe_screen *_screen,685struct pipe_context *_pipe,686struct pipe_resource *resource,687unsigned plane,688unsigned layer,689unsigned level,690enum pipe_resource_param param,691unsigned handle_usage,692uint64_t *value)693{694struct trace_screen *tr_screen = trace_screen(_screen);695struct pipe_context *pipe = _pipe ? trace_get_possibly_threaded_context(_pipe) : NULL;696struct pipe_screen *screen = tr_screen->screen;697698/* TODO trace call */699700return screen->resource_get_param(screen, pipe,701resource, plane, layer, level, param,702handle_usage, value);703}704705static void706trace_screen_resource_get_info(struct pipe_screen *_screen,707struct pipe_resource *resource,708unsigned *stride,709unsigned *offset)710{711struct trace_screen *tr_screen = trace_screen(_screen);712struct pipe_screen *screen = tr_screen->screen;713714/* TODO trace call */715716screen->resource_get_info(screen, resource, stride, offset);717}718719static struct pipe_resource *720trace_screen_resource_from_memobj(struct pipe_screen *_screen,721const struct pipe_resource *templ,722struct pipe_memory_object *memobj,723uint64_t offset)724{725struct pipe_screen *screen = trace_screen(_screen)->screen;726727trace_dump_call_begin("pipe_screen", "resource_from_memobj");728trace_dump_arg(ptr, screen);729trace_dump_arg(resource_template, templ);730trace_dump_arg(ptr, memobj);731trace_dump_arg(uint, offset);732733struct pipe_resource *res =734screen->resource_from_memobj(screen, templ, memobj, offset);735736if (!res)737return NULL;738res->screen = _screen;739740trace_dump_ret(ptr, res);741trace_dump_call_end();742return res;743}744745static void746trace_screen_resource_changed(struct pipe_screen *_screen,747struct pipe_resource *resource)748{749struct trace_screen *tr_scr = trace_screen(_screen);750struct pipe_screen *screen = tr_scr->screen;751752trace_dump_call_begin("pipe_screen", "resource_changed");753754trace_dump_arg(ptr, screen);755trace_dump_arg(ptr, resource);756757if (screen->resource_changed)758screen->resource_changed(screen, resource);759760trace_dump_call_end();761}762763static void764trace_screen_resource_destroy(struct pipe_screen *_screen,765struct pipe_resource *resource)766{767struct trace_screen *tr_scr = trace_screen(_screen);768struct pipe_screen *screen = tr_scr->screen;769770/* Don't trace this, because due to the lack of pipe_resource wrapping,771* we can get this call from inside of driver calls, which would try772* to lock an already-locked mutex.773*/774screen->resource_destroy(screen, resource);775}776777778/********************************************************************779* fence780*/781782783static void784trace_screen_fence_reference(struct pipe_screen *_screen,785struct pipe_fence_handle **pdst,786struct pipe_fence_handle *src)787{788struct trace_screen *tr_scr = trace_screen(_screen);789struct pipe_screen *screen = tr_scr->screen;790struct pipe_fence_handle *dst;791792assert(pdst);793dst = *pdst;794795trace_dump_call_begin("pipe_screen", "fence_reference");796797trace_dump_arg(ptr, screen);798trace_dump_arg(ptr, dst);799trace_dump_arg(ptr, src);800801screen->fence_reference(screen, pdst, src);802803trace_dump_call_end();804}805806807static int808trace_screen_fence_get_fd(struct pipe_screen *_screen,809struct pipe_fence_handle *fence)810{811struct trace_screen *tr_scr = trace_screen(_screen);812struct pipe_screen *screen = tr_scr->screen;813int result;814815trace_dump_call_begin("pipe_screen", "fence_get_fd");816817trace_dump_arg(ptr, screen);818trace_dump_arg(ptr, fence);819820result = screen->fence_get_fd(screen, fence);821822trace_dump_ret(int, result);823824trace_dump_call_end();825826return result;827}828829830static bool831trace_screen_fence_finish(struct pipe_screen *_screen,832struct pipe_context *_ctx,833struct pipe_fence_handle *fence,834uint64_t timeout)835{836struct trace_screen *tr_scr = trace_screen(_screen);837struct pipe_screen *screen = tr_scr->screen;838struct pipe_context *ctx = _ctx ? trace_get_possibly_threaded_context(_ctx) : NULL;839int result;840841result = screen->fence_finish(screen, ctx, fence, timeout);842843844trace_dump_call_begin("pipe_screen", "fence_finish");845846trace_dump_arg(ptr, screen);847trace_dump_arg(ptr, ctx);848trace_dump_arg(ptr, fence);849trace_dump_arg(uint, timeout);850851trace_dump_ret(bool, result);852853trace_dump_call_end();854855return result;856}857858859/********************************************************************860* memobj861*/862863static struct pipe_memory_object *864trace_screen_memobj_create_from_handle(struct pipe_screen *_screen,865struct winsys_handle *handle,866bool dedicated)867{868struct pipe_screen *screen = trace_screen(_screen)->screen;869870trace_dump_call_begin("pipe_screen", "memobj_create_from_handle");871trace_dump_arg(ptr, screen);872trace_dump_arg(ptr, handle);873trace_dump_arg(bool, dedicated);874875struct pipe_memory_object *res =876screen->memobj_create_from_handle(screen, handle, dedicated);877878trace_dump_ret(ptr, res);879trace_dump_call_end();880881return res;882}883884static void885trace_screen_memobj_destroy(struct pipe_screen *_screen,886struct pipe_memory_object *memobj)887{888struct pipe_screen *screen = trace_screen(_screen)->screen;889890trace_dump_call_begin("pipe_screen", "memobj_destroy");891trace_dump_arg(ptr, screen);892trace_dump_arg(ptr, memobj);893trace_dump_call_end();894895screen->memobj_destroy(screen, memobj);896}897898899/********************************************************************900* screen901*/902903static uint64_t904trace_screen_get_timestamp(struct pipe_screen *_screen)905{906struct trace_screen *tr_scr = trace_screen(_screen);907struct pipe_screen *screen = tr_scr->screen;908uint64_t result;909910trace_dump_call_begin("pipe_screen", "get_timestamp");911trace_dump_arg(ptr, screen);912913result = screen->get_timestamp(screen);914915trace_dump_ret(uint, result);916trace_dump_call_end();917918return result;919}920921static void922trace_screen_finalize_nir(struct pipe_screen *_screen, void *nir, bool optimize)923{924struct pipe_screen *screen = trace_screen(_screen)->screen;925926screen->finalize_nir(screen, nir, optimize);927}928929static void930trace_screen_destroy(struct pipe_screen *_screen)931{932struct trace_screen *tr_scr = trace_screen(_screen);933struct pipe_screen *screen = tr_scr->screen;934935trace_dump_call_begin("pipe_screen", "destroy");936trace_dump_arg(ptr, screen);937trace_dump_call_end();938939if (trace_screens) {940struct hash_entry *he = _mesa_hash_table_search(trace_screens, screen);941if (he) {942_mesa_hash_table_remove(trace_screens, he);943if (!_mesa_hash_table_num_entries(trace_screens)) {944_mesa_hash_table_destroy(trace_screens, NULL);945trace_screens = NULL;946}947}948}949950screen->destroy(screen);951952FREE(tr_scr);953}954955static void956trace_screen_query_memory_info(struct pipe_screen *_screen, struct pipe_memory_info *info)957{958struct trace_screen *tr_scr = trace_screen(_screen);959struct pipe_screen *screen = tr_scr->screen;960961trace_dump_call_begin("pipe_screen", "query_memory_info");962963trace_dump_arg(ptr, screen);964965screen->query_memory_info(screen, info);966967trace_dump_ret(memory_info, info);968969trace_dump_call_end();970}971972static void973trace_screen_query_dmabuf_modifiers(struct pipe_screen *_screen, enum pipe_format format, int max, uint64_t *modifiers, unsigned int *external_only, int *count)974{975struct trace_screen *tr_scr = trace_screen(_screen);976struct pipe_screen *screen = tr_scr->screen;977978trace_dump_call_begin("pipe_screen", "query_dmabuf_modifiers");979980trace_dump_arg(ptr, screen);981trace_dump_arg(format, format);982trace_dump_arg(int, max);983984screen->query_dmabuf_modifiers(screen, format, max, modifiers, external_only, count);985986if (max)987trace_dump_arg_array(uint, modifiers, *count);988else989trace_dump_arg_array(uint, modifiers, max);990trace_dump_arg_array(uint, external_only, max);991trace_dump_ret_begin();992trace_dump_uint(*count);993trace_dump_ret_end();994995trace_dump_call_end();996}997998static bool999trace_screen_is_dmabuf_modifier_supported(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format, bool *external_only)1000{1001struct trace_screen *tr_scr = trace_screen(_screen);1002struct pipe_screen *screen = tr_scr->screen;10031004trace_dump_call_begin("pipe_screen", "is_dmabuf_modifier_supported");10051006trace_dump_arg(ptr, screen);1007trace_dump_arg(uint, modifier);1008trace_dump_arg(format, format);10091010bool ret = screen->is_dmabuf_modifier_supported(screen, modifier, format, external_only);10111012trace_dump_arg_begin("external_only");1013trace_dump_bool(external_only ? *external_only : false);1014trace_dump_arg_end();10151016trace_dump_ret(bool, ret);10171018trace_dump_call_end();1019return ret;1020}10211022static unsigned int1023trace_screen_get_dmabuf_modifier_planes(struct pipe_screen *_screen, uint64_t modifier, enum pipe_format format)1024{1025struct trace_screen *tr_scr = trace_screen(_screen);1026struct pipe_screen *screen = tr_scr->screen;10271028trace_dump_call_begin("pipe_screen", "get_dmabuf_modifier_planes");10291030trace_dump_arg(ptr, screen);1031trace_dump_arg(uint, modifier);1032trace_dump_arg(format, format);10331034unsigned ret = screen->get_dmabuf_modifier_planes(screen, modifier, format);10351036trace_dump_ret(uint, ret);10371038trace_dump_call_end();1039return ret;1040}10411042bool1043trace_enabled(void)1044{1045static bool firstrun = true;10461047if (!firstrun)1048return trace;1049firstrun = false;10501051if(trace_dump_trace_begin()) {1052trace_dumping_start();1053trace = true;1054}10551056return trace;1057}10581059struct pipe_screen *1060trace_screen_create(struct pipe_screen *screen)1061{1062struct trace_screen *tr_scr;10631064#ifdef ZINK_WITH_SWRAST_VK1065/* if zink+lavapipe is enabled, ensure that only one driver is traced */1066const char *driver = debug_get_option("MESA_LOADER_DRIVER_OVERRIDE", NULL);1067if (driver && !strcmp(driver, "zink")) {1068/* the user wants zink: check whether they want to trace zink or lavapipe */1069bool trace_lavapipe = debug_get_bool_option("ZINK_TRACE_LAVAPIPE", false);1070if (!strncmp(screen->get_name(screen), "zink", 4)) {1071/* this is the zink screen: only trace if lavapipe tracing is disabled */1072if (trace_lavapipe)1073return screen;1074} else {1075/* this is the llvmpipe screen: only trace if lavapipe tracing is enabled */1076if (!trace_lavapipe)1077return screen;1078}1079}1080#endif1081if (!trace_enabled())1082goto error1;10831084trace_dump_call_begin("", "pipe_screen_create");10851086tr_scr = CALLOC_STRUCT(trace_screen);1087if (!tr_scr)1088goto error2;10891090#define SCR_INIT(_member) \1091tr_scr->base._member = screen->_member ? trace_screen_##_member : NULL10921093tr_scr->base.destroy = trace_screen_destroy;1094tr_scr->base.get_name = trace_screen_get_name;1095tr_scr->base.get_vendor = trace_screen_get_vendor;1096tr_scr->base.get_device_vendor = trace_screen_get_device_vendor;1097SCR_INIT(get_compiler_options);1098SCR_INIT(get_disk_shader_cache);1099tr_scr->base.get_param = trace_screen_get_param;1100tr_scr->base.get_shader_param = trace_screen_get_shader_param;1101tr_scr->base.get_paramf = trace_screen_get_paramf;1102tr_scr->base.get_compute_param = trace_screen_get_compute_param;1103tr_scr->base.is_format_supported = trace_screen_is_format_supported;1104assert(screen->context_create);1105tr_scr->base.context_create = trace_screen_context_create;1106tr_scr->base.resource_create = trace_screen_resource_create;1107SCR_INIT(resource_create_with_modifiers);1108tr_scr->base.resource_create_unbacked = trace_screen_resource_create_unbacked;1109tr_scr->base.resource_bind_backing = trace_screen_resource_bind_backing;1110tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;1111tr_scr->base.allocate_memory = trace_screen_allocate_memory;1112tr_scr->base.free_memory = trace_screen_free_memory;1113tr_scr->base.map_memory = trace_screen_map_memory;1114tr_scr->base.unmap_memory = trace_screen_unmap_memory;1115SCR_INIT(query_memory_info);1116SCR_INIT(query_dmabuf_modifiers);1117SCR_INIT(is_dmabuf_modifier_supported);1118SCR_INIT(get_dmabuf_modifier_planes);1119SCR_INIT(check_resource_capability);1120tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;1121SCR_INIT(resource_get_param);1122SCR_INIT(resource_get_info);1123SCR_INIT(resource_from_memobj);1124SCR_INIT(resource_changed);1125tr_scr->base.resource_destroy = trace_screen_resource_destroy;1126tr_scr->base.fence_reference = trace_screen_fence_reference;1127SCR_INIT(fence_get_fd);1128tr_scr->base.fence_finish = trace_screen_fence_finish;1129SCR_INIT(memobj_create_from_handle);1130SCR_INIT(memobj_destroy);1131tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;1132tr_scr->base.get_timestamp = trace_screen_get_timestamp;1133SCR_INIT(get_driver_uuid);1134SCR_INIT(get_device_uuid);1135SCR_INIT(finalize_nir);1136tr_scr->base.transfer_helper = screen->transfer_helper;11371138tr_scr->screen = screen;11391140trace_dump_ret(ptr, screen);1141trace_dump_call_end();11421143if (!trace_screens)1144trace_screens = _mesa_hash_table_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);1145_mesa_hash_table_insert(trace_screens, screen, tr_scr);11461147tr_scr->trace_tc = debug_get_bool_option("GALLIUM_TRACE_TC", false);11481149return &tr_scr->base;11501151error2:1152trace_dump_ret(ptr, screen);1153trace_dump_call_end();1154error1:1155return screen;1156}115711581159struct trace_screen *1160trace_screen(struct pipe_screen *screen)1161{1162assert(screen);1163assert(screen->destroy == trace_screen_destroy);1164return (struct trace_screen *)screen;1165}116611671168