Path: blob/21.2-virgl/src/gallium/auxiliary/driver_trace/tr_context.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/ralloc.h"28#include "util/u_inlines.h"29#include "util/u_memory.h"30#include "util/simple_list.h"31#include "util/u_framebuffer.h"3233#include "pipe/p_format.h"34#include "pipe/p_screen.h"3536#include "tr_dump.h"37#include "tr_dump_defines.h"38#include "tr_dump_state.h"39#include "tr_public.h"40#include "tr_screen.h"41#include "tr_texture.h"42#include "tr_context.h"434445struct trace_query46{47struct threaded_query base;48unsigned type;4950struct pipe_query *query;51};525354static inline struct trace_query *55trace_query(struct pipe_query *query)56{57return (struct trace_query *)query;58}596061static inline struct pipe_query *62trace_query_unwrap(struct pipe_query *query)63{64if (query) {65return trace_query(query)->query;66} else {67return NULL;68}69}707172static inline struct pipe_surface *73trace_surface_unwrap(struct trace_context *tr_ctx,74struct pipe_surface *surface)75{76struct trace_surface *tr_surf;7778if (!surface)79return NULL;8081assert(surface->texture);82if (!surface->texture)83return surface;8485tr_surf = trace_surface(surface);8687assert(tr_surf->surface);88return tr_surf->surface;89}9091static void92dump_fb_state(struct trace_context *tr_ctx,93const char *method,94bool deep)95{96struct pipe_context *pipe = tr_ctx->pipe;9798trace_dump_call_begin("pipe_context", method);99100trace_dump_arg(ptr, pipe);101if (deep)102trace_dump_arg(framebuffer_state_deep, &tr_ctx->unwrapped_state);103else104trace_dump_arg(framebuffer_state, &tr_ctx->unwrapped_state);105trace_dump_call_end();106107tr_ctx->seen_fb_state = true;108}109110static void111trace_context_draw_vbo(struct pipe_context *_pipe,112const struct pipe_draw_info *info,113unsigned drawid_offset,114const struct pipe_draw_indirect_info *indirect,115const struct pipe_draw_start_count_bias *draws,116unsigned num_draws)117{118struct trace_context *tr_ctx = trace_context(_pipe);119struct pipe_context *pipe = tr_ctx->pipe;120121if (!tr_ctx->seen_fb_state && trace_dump_is_triggered())122dump_fb_state(tr_ctx, "current_framebuffer_state", true);123124trace_dump_call_begin("pipe_context", "draw_vbo");125126trace_dump_arg(ptr, pipe);127trace_dump_arg(draw_info, info);128trace_dump_arg(int, drawid_offset);129trace_dump_arg(draw_indirect_info, indirect);130trace_dump_arg_begin("draws");131trace_dump_struct_array(draw_start_count, draws, num_draws);132trace_dump_arg_end();133trace_dump_arg(uint, num_draws);134135trace_dump_trace_flush();136137pipe->draw_vbo(pipe, info, drawid_offset, indirect, draws, num_draws);138139trace_dump_call_end();140}141142143static struct pipe_query *144trace_context_create_query(struct pipe_context *_pipe,145unsigned query_type,146unsigned index)147{148struct trace_context *tr_ctx = trace_context(_pipe);149struct pipe_context *pipe = tr_ctx->pipe;150struct pipe_query *query;151152trace_dump_call_begin("pipe_context", "create_query");153154trace_dump_arg(ptr, pipe);155trace_dump_arg(query_type, query_type);156trace_dump_arg(int, index);157158query = pipe->create_query(pipe, query_type, index);159160trace_dump_ret(ptr, query);161162trace_dump_call_end();163164/* Wrap query object. */165if (query) {166struct trace_query *tr_query = CALLOC_STRUCT(trace_query);167if (tr_query) {168tr_query->type = query_type;169tr_query->query = query;170query = (struct pipe_query *)tr_query;171} else {172pipe->destroy_query(pipe, query);173query = NULL;174}175}176177return query;178}179180181static void182trace_context_destroy_query(struct pipe_context *_pipe,183struct pipe_query *_query)184{185struct trace_context *tr_ctx = trace_context(_pipe);186struct pipe_context *pipe = tr_ctx->pipe;187struct trace_query *tr_query = trace_query(_query);188struct pipe_query *query = tr_query->query;189190FREE(tr_query);191192trace_dump_call_begin("pipe_context", "destroy_query");193194trace_dump_arg(ptr, pipe);195trace_dump_arg(ptr, query);196197pipe->destroy_query(pipe, query);198199trace_dump_call_end();200}201202203static bool204trace_context_begin_query(struct pipe_context *_pipe,205struct pipe_query *query)206{207struct trace_context *tr_ctx = trace_context(_pipe);208struct pipe_context *pipe = tr_ctx->pipe;209bool ret;210211query = trace_query_unwrap(query);212213trace_dump_call_begin("pipe_context", "begin_query");214215trace_dump_arg(ptr, pipe);216trace_dump_arg(ptr, query);217218ret = pipe->begin_query(pipe, query);219220trace_dump_call_end();221return ret;222}223224225static bool226trace_context_end_query(struct pipe_context *_pipe,227struct pipe_query *_query)228{229struct trace_context *tr_ctx = trace_context(_pipe);230struct pipe_context *pipe = tr_ctx->pipe;231bool ret;232233struct pipe_query *query = trace_query_unwrap(_query);234235trace_dump_call_begin("pipe_context", "end_query");236237trace_dump_arg(ptr, pipe);238trace_dump_arg(ptr, query);239240if (tr_ctx->threaded)241threaded_query(query)->flushed = trace_query(_query)->base.flushed;242ret = pipe->end_query(pipe, query);243244trace_dump_call_end();245return ret;246}247248249static bool250trace_context_get_query_result(struct pipe_context *_pipe,251struct pipe_query *_query,252bool wait,253union pipe_query_result *result)254{255struct trace_context *tr_ctx = trace_context(_pipe);256struct pipe_context *pipe = tr_ctx->pipe;257struct trace_query *tr_query = trace_query(_query);258struct pipe_query *query = tr_query->query;259bool ret;260261trace_dump_call_begin("pipe_context", "get_query_result");262263trace_dump_arg(ptr, pipe);264trace_dump_arg(ptr, query);265trace_dump_arg(bool, wait);266267if (tr_ctx->threaded)268threaded_query(query)->flushed = trace_query(_query)->base.flushed;269270ret = pipe->get_query_result(pipe, query, wait, result);271272trace_dump_arg_begin("result");273if (ret) {274trace_dump_query_result(tr_query->type, result);275} else {276trace_dump_null();277}278trace_dump_arg_end();279280trace_dump_ret(bool, ret);281282trace_dump_call_end();283284return ret;285}286287288static void289trace_context_set_active_query_state(struct pipe_context *_pipe,290bool enable)291{292struct trace_context *tr_ctx = trace_context(_pipe);293struct pipe_context *pipe = tr_ctx->pipe;294295trace_dump_call_begin("pipe_context", "set_active_query_state");296297trace_dump_arg(ptr, pipe);298trace_dump_arg(bool, enable);299300pipe->set_active_query_state(pipe, enable);301302trace_dump_call_end();303}304305306static void *307trace_context_create_blend_state(struct pipe_context *_pipe,308const struct pipe_blend_state *state)309{310struct trace_context *tr_ctx = trace_context(_pipe);311struct pipe_context *pipe = tr_ctx->pipe;312void * result;313314trace_dump_call_begin("pipe_context", "create_blend_state");315316trace_dump_arg(ptr, pipe);317trace_dump_arg(blend_state, state);318319result = pipe->create_blend_state(pipe, state);320321trace_dump_ret(ptr, result);322323trace_dump_call_end();324325struct pipe_blend_state *blend = ralloc(tr_ctx, struct pipe_blend_state);326if (blend) {327memcpy(blend, state, sizeof(struct pipe_blend_state));328_mesa_hash_table_insert(&tr_ctx->blend_states, result, blend);329}330331return result;332}333334335static void336trace_context_bind_blend_state(struct pipe_context *_pipe,337void *state)338{339struct trace_context *tr_ctx = trace_context(_pipe);340struct pipe_context *pipe = tr_ctx->pipe;341342trace_dump_call_begin("pipe_context", "bind_blend_state");343344trace_dump_arg(ptr, pipe);345if (state && trace_dump_is_triggered()) {346struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);347if (he)348trace_dump_arg(blend_state, he->data);349else350trace_dump_arg(blend_state, NULL);351} else352trace_dump_arg(ptr, state);353354pipe->bind_blend_state(pipe, state);355356trace_dump_call_end();357}358359360static void361trace_context_delete_blend_state(struct pipe_context *_pipe,362void *state)363{364struct trace_context *tr_ctx = trace_context(_pipe);365struct pipe_context *pipe = tr_ctx->pipe;366367trace_dump_call_begin("pipe_context", "delete_blend_state");368369trace_dump_arg(ptr, pipe);370trace_dump_arg(ptr, state);371372pipe->delete_blend_state(pipe, state);373374if (state) {375struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->blend_states, state);376if (he) {377ralloc_free(he->data);378_mesa_hash_table_remove(&tr_ctx->blend_states, he);379}380}381382trace_dump_call_end();383}384385386static void *387trace_context_create_sampler_state(struct pipe_context *_pipe,388const struct pipe_sampler_state *state)389{390struct trace_context *tr_ctx = trace_context(_pipe);391struct pipe_context *pipe = tr_ctx->pipe;392void * result;393394trace_dump_call_begin("pipe_context", "create_sampler_state");395396trace_dump_arg(ptr, pipe);397trace_dump_arg(sampler_state, state);398399result = pipe->create_sampler_state(pipe, state);400401trace_dump_ret(ptr, result);402403trace_dump_call_end();404405return result;406}407408409static void410trace_context_bind_sampler_states(struct pipe_context *_pipe,411enum pipe_shader_type shader,412unsigned start,413unsigned num_states,414void **states)415{416struct trace_context *tr_ctx = trace_context(_pipe);417struct pipe_context *pipe = tr_ctx->pipe;418419/* remove this when we have pipe->bind_sampler_states(..., start, ...) */420assert(start == 0);421422trace_dump_call_begin("pipe_context", "bind_sampler_states");423424trace_dump_arg(ptr, pipe);425trace_dump_arg(uint, shader);426trace_dump_arg(uint, start);427trace_dump_arg(uint, num_states);428trace_dump_arg_array(ptr, states, num_states);429430pipe->bind_sampler_states(pipe, shader, start, num_states, states);431432trace_dump_call_end();433}434435436static void437trace_context_delete_sampler_state(struct pipe_context *_pipe,438void *state)439{440struct trace_context *tr_ctx = trace_context(_pipe);441struct pipe_context *pipe = tr_ctx->pipe;442443trace_dump_call_begin("pipe_context", "delete_sampler_state");444445trace_dump_arg(ptr, pipe);446trace_dump_arg(ptr, state);447448pipe->delete_sampler_state(pipe, state);449450trace_dump_call_end();451}452453454static void *455trace_context_create_rasterizer_state(struct pipe_context *_pipe,456const struct pipe_rasterizer_state *state)457{458struct trace_context *tr_ctx = trace_context(_pipe);459struct pipe_context *pipe = tr_ctx->pipe;460void * result;461462trace_dump_call_begin("pipe_context", "create_rasterizer_state");463464trace_dump_arg(ptr, pipe);465trace_dump_arg(rasterizer_state, state);466467result = pipe->create_rasterizer_state(pipe, state);468469trace_dump_ret(ptr, result);470471trace_dump_call_end();472473struct pipe_rasterizer_state *rasterizer = ralloc(tr_ctx, struct pipe_rasterizer_state);474if (rasterizer) {475memcpy(rasterizer, state, sizeof(struct pipe_rasterizer_state));476_mesa_hash_table_insert(&tr_ctx->rasterizer_states, result, rasterizer);477}478479return result;480}481482483static void484trace_context_bind_rasterizer_state(struct pipe_context *_pipe,485void *state)486{487struct trace_context *tr_ctx = trace_context(_pipe);488struct pipe_context *pipe = tr_ctx->pipe;489490trace_dump_call_begin("pipe_context", "bind_rasterizer_state");491492trace_dump_arg(ptr, pipe);493if (state && trace_dump_is_triggered()) {494struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);495if (he)496trace_dump_arg(rasterizer_state, he->data);497else498trace_dump_arg(rasterizer_state, NULL);499} else500trace_dump_arg(ptr, state);501502pipe->bind_rasterizer_state(pipe, state);503504trace_dump_call_end();505}506507508static void509trace_context_delete_rasterizer_state(struct pipe_context *_pipe,510void *state)511{512struct trace_context *tr_ctx = trace_context(_pipe);513struct pipe_context *pipe = tr_ctx->pipe;514515trace_dump_call_begin("pipe_context", "delete_rasterizer_state");516517trace_dump_arg(ptr, pipe);518trace_dump_arg(ptr, state);519520pipe->delete_rasterizer_state(pipe, state);521522trace_dump_call_end();523524if (state) {525struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->rasterizer_states, state);526if (he) {527ralloc_free(he->data);528_mesa_hash_table_remove(&tr_ctx->rasterizer_states, he);529}530}531}532533534static void *535trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,536const struct pipe_depth_stencil_alpha_state *state)537{538struct trace_context *tr_ctx = trace_context(_pipe);539struct pipe_context *pipe = tr_ctx->pipe;540void * result;541542trace_dump_call_begin("pipe_context", "create_depth_stencil_alpha_state");543544result = pipe->create_depth_stencil_alpha_state(pipe, state);545546trace_dump_arg(ptr, pipe);547trace_dump_arg(depth_stencil_alpha_state, state);548549trace_dump_ret(ptr, result);550551trace_dump_call_end();552553struct pipe_depth_stencil_alpha_state *depth_stencil_alpha = ralloc(tr_ctx, struct pipe_depth_stencil_alpha_state);554if (depth_stencil_alpha) {555memcpy(depth_stencil_alpha, state, sizeof(struct pipe_depth_stencil_alpha_state));556_mesa_hash_table_insert(&tr_ctx->depth_stencil_alpha_states, result, depth_stencil_alpha);557}558559return result;560}561562563static void564trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,565void *state)566{567struct trace_context *tr_ctx = trace_context(_pipe);568struct pipe_context *pipe = tr_ctx->pipe;569570trace_dump_call_begin("pipe_context", "bind_depth_stencil_alpha_state");571572trace_dump_arg(ptr, pipe);573if (state && trace_dump_is_triggered()) {574struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);575if (he)576trace_dump_arg(depth_stencil_alpha_state, he->data);577else578trace_dump_arg(depth_stencil_alpha_state, NULL);579} else580trace_dump_arg(ptr, state);581582pipe->bind_depth_stencil_alpha_state(pipe, state);583584trace_dump_call_end();585}586587588static void589trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,590void *state)591{592struct trace_context *tr_ctx = trace_context(_pipe);593struct pipe_context *pipe = tr_ctx->pipe;594595trace_dump_call_begin("pipe_context", "delete_depth_stencil_alpha_state");596597trace_dump_arg(ptr, pipe);598trace_dump_arg(ptr, state);599600pipe->delete_depth_stencil_alpha_state(pipe, state);601602trace_dump_call_end();603604if (state) {605struct hash_entry *he = _mesa_hash_table_search(&tr_ctx->depth_stencil_alpha_states, state);606if (he) {607ralloc_free(he->data);608_mesa_hash_table_remove(&tr_ctx->depth_stencil_alpha_states, he);609}610}611}612613614#define TRACE_SHADER_STATE(shader_type) \615static void * \616trace_context_create_##shader_type##_state(struct pipe_context *_pipe, \617const struct pipe_shader_state *state) \618{ \619struct trace_context *tr_ctx = trace_context(_pipe); \620struct pipe_context *pipe = tr_ctx->pipe; \621void * result; \622trace_dump_call_begin("pipe_context", "create_" #shader_type "_state"); \623trace_dump_arg(ptr, pipe); \624trace_dump_arg(shader_state, state); \625result = pipe->create_##shader_type##_state(pipe, state); \626trace_dump_ret(ptr, result); \627trace_dump_call_end(); \628return result; \629} \630\631static void \632trace_context_bind_##shader_type##_state(struct pipe_context *_pipe, \633void *state) \634{ \635struct trace_context *tr_ctx = trace_context(_pipe); \636struct pipe_context *pipe = tr_ctx->pipe; \637trace_dump_call_begin("pipe_context", "bind_" #shader_type "_state"); \638trace_dump_arg(ptr, pipe); \639trace_dump_arg(ptr, state); \640pipe->bind_##shader_type##_state(pipe, state); \641trace_dump_call_end(); \642} \643\644static void \645trace_context_delete_##shader_type##_state(struct pipe_context *_pipe, \646void *state) \647{ \648struct trace_context *tr_ctx = trace_context(_pipe); \649struct pipe_context *pipe = tr_ctx->pipe; \650trace_dump_call_begin("pipe_context", "delete_" #shader_type "_state"); \651trace_dump_arg(ptr, pipe); \652trace_dump_arg(ptr, state); \653pipe->delete_##shader_type##_state(pipe, state); \654trace_dump_call_end(); \655}656657TRACE_SHADER_STATE(fs)658TRACE_SHADER_STATE(vs)659TRACE_SHADER_STATE(gs)660TRACE_SHADER_STATE(tcs)661TRACE_SHADER_STATE(tes)662663#undef TRACE_SHADER_STATE664665666static inline void *667trace_context_create_compute_state(struct pipe_context *_pipe,668const struct pipe_compute_state *state)669{670struct trace_context *tr_ctx = trace_context(_pipe);671struct pipe_context *pipe = tr_ctx->pipe;672void * result;673674trace_dump_call_begin("pipe_context", "create_compute_state");675trace_dump_arg(ptr, pipe);676trace_dump_arg(compute_state, state);677result = pipe->create_compute_state(pipe, state);678trace_dump_ret(ptr, result);679trace_dump_call_end();680return result;681}682683static inline void684trace_context_bind_compute_state(struct pipe_context *_pipe,685void *state)686{687struct trace_context *tr_ctx = trace_context(_pipe);688struct pipe_context *pipe = tr_ctx->pipe;689690trace_dump_call_begin("pipe_context", "bind_compute_state");691trace_dump_arg(ptr, pipe);692trace_dump_arg(ptr, state);693pipe->bind_compute_state(pipe, state);694trace_dump_call_end();695}696697static inline void698trace_context_delete_compute_state(struct pipe_context *_pipe,699void *state)700{701struct trace_context *tr_ctx = trace_context(_pipe);702struct pipe_context *pipe = tr_ctx->pipe;703704trace_dump_call_begin("pipe_context", "delete_compute_state");705trace_dump_arg(ptr, pipe);706trace_dump_arg(ptr, state);707pipe->delete_compute_state(pipe, state);708trace_dump_call_end();709}710711static void *712trace_context_create_vertex_elements_state(struct pipe_context *_pipe,713unsigned num_elements,714const struct pipe_vertex_element *elements)715{716struct trace_context *tr_ctx = trace_context(_pipe);717struct pipe_context *pipe = tr_ctx->pipe;718void * result;719720trace_dump_call_begin("pipe_context", "create_vertex_elements_state");721722trace_dump_arg(ptr, pipe);723trace_dump_arg(uint, num_elements);724725trace_dump_arg_begin("elements");726trace_dump_struct_array(vertex_element, elements, num_elements);727trace_dump_arg_end();728729result = pipe->create_vertex_elements_state(pipe, num_elements, elements);730731trace_dump_ret(ptr, result);732733trace_dump_call_end();734735return result;736}737738739static void740trace_context_bind_vertex_elements_state(struct pipe_context *_pipe,741void *state)742{743struct trace_context *tr_ctx = trace_context(_pipe);744struct pipe_context *pipe = tr_ctx->pipe;745746trace_dump_call_begin("pipe_context", "bind_vertex_elements_state");747748trace_dump_arg(ptr, pipe);749trace_dump_arg(ptr, state);750751pipe->bind_vertex_elements_state(pipe, state);752753trace_dump_call_end();754}755756757static void758trace_context_delete_vertex_elements_state(struct pipe_context *_pipe,759void *state)760{761struct trace_context *tr_ctx = trace_context(_pipe);762struct pipe_context *pipe = tr_ctx->pipe;763764trace_dump_call_begin("pipe_context", "delete_vertex_elements_state");765766trace_dump_arg(ptr, pipe);767trace_dump_arg(ptr, state);768769pipe->delete_vertex_elements_state(pipe, state);770771trace_dump_call_end();772}773774775static void776trace_context_set_blend_color(struct pipe_context *_pipe,777const struct pipe_blend_color *state)778{779struct trace_context *tr_ctx = trace_context(_pipe);780struct pipe_context *pipe = tr_ctx->pipe;781782trace_dump_call_begin("pipe_context", "set_blend_color");783784trace_dump_arg(ptr, pipe);785trace_dump_arg(blend_color, state);786787pipe->set_blend_color(pipe, state);788789trace_dump_call_end();790}791792793static void794trace_context_set_stencil_ref(struct pipe_context *_pipe,795const struct pipe_stencil_ref state)796{797struct trace_context *tr_ctx = trace_context(_pipe);798struct pipe_context *pipe = tr_ctx->pipe;799800trace_dump_call_begin("pipe_context", "set_stencil_ref");801802trace_dump_arg(ptr, pipe);803trace_dump_arg(stencil_ref, &state);804805pipe->set_stencil_ref(pipe, state);806807trace_dump_call_end();808}809810811static void812trace_context_set_clip_state(struct pipe_context *_pipe,813const struct pipe_clip_state *state)814{815struct trace_context *tr_ctx = trace_context(_pipe);816struct pipe_context *pipe = tr_ctx->pipe;817818trace_dump_call_begin("pipe_context", "set_clip_state");819820trace_dump_arg(ptr, pipe);821trace_dump_arg(clip_state, state);822823pipe->set_clip_state(pipe, state);824825trace_dump_call_end();826}827828static void829trace_context_set_sample_mask(struct pipe_context *_pipe,830unsigned sample_mask)831{832struct trace_context *tr_ctx = trace_context(_pipe);833struct pipe_context *pipe = tr_ctx->pipe;834835trace_dump_call_begin("pipe_context", "set_sample_mask");836837trace_dump_arg(ptr, pipe);838trace_dump_arg(uint, sample_mask);839840pipe->set_sample_mask(pipe, sample_mask);841842trace_dump_call_end();843}844845static void846trace_context_set_constant_buffer(struct pipe_context *_pipe,847enum pipe_shader_type shader, uint index,848bool take_ownership,849const struct pipe_constant_buffer *constant_buffer)850{851struct trace_context *tr_ctx = trace_context(_pipe);852struct pipe_context *pipe = tr_ctx->pipe;853854trace_dump_call_begin("pipe_context", "set_constant_buffer");855856trace_dump_arg(ptr, pipe);857trace_dump_arg(uint, shader);858trace_dump_arg(uint, index);859trace_dump_arg(bool, take_ownership);860trace_dump_arg(constant_buffer, constant_buffer);861862pipe->set_constant_buffer(pipe, shader, index, take_ownership, constant_buffer);863864trace_dump_call_end();865}866867868static void869trace_context_set_framebuffer_state(struct pipe_context *_pipe,870const struct pipe_framebuffer_state *state)871{872struct trace_context *tr_ctx = trace_context(_pipe);873struct pipe_context *pipe = tr_ctx->pipe;874unsigned i;875876/* Unwrap the input state */877memcpy(&tr_ctx->unwrapped_state, state, sizeof(tr_ctx->unwrapped_state));878for (i = 0; i < state->nr_cbufs; ++i)879tr_ctx->unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]);880for (i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i)881tr_ctx->unwrapped_state.cbufs[i] = NULL;882tr_ctx->unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf);883state = &tr_ctx->unwrapped_state;884885dump_fb_state(tr_ctx, "set_framebuffer_state", trace_dump_is_triggered());886887pipe->set_framebuffer_state(pipe, state);888}889890static void891trace_context_set_inlinable_constants(struct pipe_context *_pipe, enum pipe_shader_type shader,892uint num_values, uint32_t *values)893{894struct trace_context *tr_ctx = trace_context(_pipe);895struct pipe_context *pipe = tr_ctx->pipe;896897trace_dump_call_begin("pipe_context", "set_inlinable_constants");898899trace_dump_arg(ptr, pipe);900trace_dump_arg(uint, shader);901trace_dump_arg(uint, num_values);902trace_dump_arg_array(uint, values, num_values);903904pipe->set_inlinable_constants(pipe, shader, num_values, values);905906trace_dump_call_end();907}908909910static void911trace_context_set_polygon_stipple(struct pipe_context *_pipe,912const struct pipe_poly_stipple *state)913{914struct trace_context *tr_ctx = trace_context(_pipe);915struct pipe_context *pipe = tr_ctx->pipe;916917trace_dump_call_begin("pipe_context", "set_polygon_stipple");918919trace_dump_arg(ptr, pipe);920trace_dump_arg(poly_stipple, state);921922pipe->set_polygon_stipple(pipe, state);923924trace_dump_call_end();925}926927static void928trace_context_set_min_samples(struct pipe_context *_pipe,929unsigned min_samples)930{931struct trace_context *tr_ctx = trace_context(_pipe);932struct pipe_context *pipe = tr_ctx->pipe;933934trace_dump_call_begin("pipe_context", "set_min_samples");935936trace_dump_arg(ptr, pipe);937trace_dump_arg(uint, min_samples);938939pipe->set_min_samples(pipe, min_samples);940941trace_dump_call_end();942}943944945static void946trace_context_set_scissor_states(struct pipe_context *_pipe,947unsigned start_slot,948unsigned num_scissors,949const struct pipe_scissor_state *states)950{951struct trace_context *tr_ctx = trace_context(_pipe);952struct pipe_context *pipe = tr_ctx->pipe;953954trace_dump_call_begin("pipe_context", "set_scissor_states");955956trace_dump_arg(ptr, pipe);957trace_dump_arg(uint, start_slot);958trace_dump_arg(uint, num_scissors);959trace_dump_arg(scissor_state, states);960961pipe->set_scissor_states(pipe, start_slot, num_scissors, states);962963trace_dump_call_end();964}965966967static void968trace_context_set_viewport_states(struct pipe_context *_pipe,969unsigned start_slot,970unsigned num_viewports,971const struct pipe_viewport_state *states)972{973struct trace_context *tr_ctx = trace_context(_pipe);974struct pipe_context *pipe = tr_ctx->pipe;975976trace_dump_call_begin("pipe_context", "set_viewport_states");977978trace_dump_arg(ptr, pipe);979trace_dump_arg(uint, start_slot);980trace_dump_arg(uint, num_viewports);981trace_dump_arg(viewport_state, states);982983pipe->set_viewport_states(pipe, start_slot, num_viewports, states);984985trace_dump_call_end();986}987988989static struct pipe_sampler_view *990trace_context_create_sampler_view(struct pipe_context *_pipe,991struct pipe_resource *resource,992const struct pipe_sampler_view *templ)993{994struct trace_context *tr_ctx = trace_context(_pipe);995struct pipe_context *pipe = tr_ctx->pipe;996struct pipe_sampler_view *result;997struct trace_sampler_view *tr_view;998999trace_dump_call_begin("pipe_context", "create_sampler_view");10001001trace_dump_arg(ptr, pipe);1002trace_dump_arg(ptr, resource);10031004trace_dump_arg_begin("templ");1005trace_dump_sampler_view_template(templ, resource->target);1006trace_dump_arg_end();10071008result = pipe->create_sampler_view(pipe, resource, templ);10091010trace_dump_ret(ptr, result);10111012trace_dump_call_end();10131014/*1015* Wrap pipe_sampler_view1016*/1017tr_view = CALLOC_STRUCT(trace_sampler_view);1018tr_view->base = *templ;1019tr_view->base.reference.count = 1;1020tr_view->base.texture = NULL;1021pipe_resource_reference(&tr_view->base.texture, resource);1022tr_view->base.context = _pipe;1023tr_view->sampler_view = result;1024result = &tr_view->base;10251026return result;1027}102810291030static void1031trace_context_sampler_view_destroy(struct pipe_context *_pipe,1032struct pipe_sampler_view *_view)1033{1034struct trace_context *tr_ctx = trace_context(_pipe);1035struct trace_sampler_view *tr_view = trace_sampler_view(_view);1036struct pipe_context *pipe = tr_ctx->pipe;1037struct pipe_sampler_view *view = tr_view->sampler_view;10381039trace_dump_call_begin("pipe_context", "sampler_view_destroy");10401041trace_dump_arg(ptr, pipe);1042trace_dump_arg(ptr, view);10431044pipe_sampler_view_reference(&tr_view->sampler_view, NULL);10451046trace_dump_call_end();10471048pipe_resource_reference(&_view->texture, NULL);1049FREE(_view);1050}10511052/********************************************************************1053* surface1054*/105510561057static struct pipe_surface *1058trace_context_create_surface(struct pipe_context *_pipe,1059struct pipe_resource *resource,1060const struct pipe_surface *surf_tmpl)1061{1062struct trace_context *tr_ctx = trace_context(_pipe);1063struct pipe_context *pipe = tr_ctx->pipe;1064struct pipe_surface *result = NULL;10651066trace_dump_call_begin("pipe_context", "create_surface");10671068trace_dump_arg(ptr, pipe);1069trace_dump_arg(ptr, resource);10701071trace_dump_arg_begin("surf_tmpl");1072trace_dump_surface_template(surf_tmpl, resource->target);1073trace_dump_arg_end();107410751076result = pipe->create_surface(pipe, resource, surf_tmpl);10771078trace_dump_ret(ptr, result);10791080trace_dump_call_end();10811082result = trace_surf_create(tr_ctx, resource, result);10831084return result;1085}108610871088static void1089trace_context_surface_destroy(struct pipe_context *_pipe,1090struct pipe_surface *_surface)1091{1092struct trace_context *tr_ctx = trace_context(_pipe);1093struct pipe_context *pipe = tr_ctx->pipe;1094struct trace_surface *tr_surf = trace_surface(_surface);1095struct pipe_surface *surface = tr_surf->surface;10961097trace_dump_call_begin("pipe_context", "surface_destroy");10981099trace_dump_arg(ptr, pipe);1100trace_dump_arg(ptr, surface);11011102trace_dump_call_end();11031104trace_surf_destroy(tr_surf);1105}110611071108static void1109trace_context_set_sampler_views(struct pipe_context *_pipe,1110enum pipe_shader_type shader,1111unsigned start,1112unsigned num,1113unsigned unbind_num_trailing_slots,1114struct pipe_sampler_view **views)1115{1116struct trace_context *tr_ctx = trace_context(_pipe);1117struct trace_sampler_view *tr_view;1118struct pipe_context *pipe = tr_ctx->pipe;1119struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];1120unsigned i;11211122/* remove this when we have pipe->set_sampler_views(..., start, ...) */1123assert(start == 0);11241125for (i = 0; i < num; ++i) {1126tr_view = trace_sampler_view(views[i]);1127unwrapped_views[i] = tr_view ? tr_view->sampler_view : NULL;1128}1129views = unwrapped_views;11301131trace_dump_call_begin("pipe_context", "set_sampler_views");11321133trace_dump_arg(ptr, pipe);1134trace_dump_arg(uint, shader);1135trace_dump_arg(uint, start);1136trace_dump_arg(uint, num);1137trace_dump_arg(uint, unbind_num_trailing_slots);1138trace_dump_arg_array(ptr, views, num);11391140pipe->set_sampler_views(pipe, shader, start, num,1141unbind_num_trailing_slots, views);11421143trace_dump_call_end();1144}114511461147static void1148trace_context_set_vertex_buffers(struct pipe_context *_pipe,1149unsigned start_slot, unsigned num_buffers,1150unsigned unbind_num_trailing_slots,1151bool take_ownership,1152const struct pipe_vertex_buffer *buffers)1153{1154struct trace_context *tr_ctx = trace_context(_pipe);1155struct pipe_context *pipe = tr_ctx->pipe;11561157trace_dump_call_begin("pipe_context", "set_vertex_buffers");11581159trace_dump_arg(ptr, pipe);1160trace_dump_arg(uint, start_slot);1161trace_dump_arg(uint, num_buffers);1162trace_dump_arg(uint, unbind_num_trailing_slots);1163trace_dump_arg(bool, take_ownership);11641165trace_dump_arg_begin("buffers");1166trace_dump_struct_array(vertex_buffer, buffers, num_buffers);1167trace_dump_arg_end();11681169pipe->set_vertex_buffers(pipe, start_slot, num_buffers,1170unbind_num_trailing_slots, take_ownership,1171buffers);11721173trace_dump_call_end();1174}117511761177static struct pipe_stream_output_target *1178trace_context_create_stream_output_target(struct pipe_context *_pipe,1179struct pipe_resource *res,1180unsigned buffer_offset,1181unsigned buffer_size)1182{1183struct trace_context *tr_ctx = trace_context(_pipe);1184struct pipe_context *pipe = tr_ctx->pipe;1185struct pipe_stream_output_target *result;11861187trace_dump_call_begin("pipe_context", "create_stream_output_target");11881189trace_dump_arg(ptr, pipe);1190trace_dump_arg(ptr, res);1191trace_dump_arg(uint, buffer_offset);1192trace_dump_arg(uint, buffer_size);11931194result = pipe->create_stream_output_target(pipe,1195res, buffer_offset, buffer_size);11961197trace_dump_ret(ptr, result);11981199trace_dump_call_end();12001201return result;1202}120312041205static void1206trace_context_stream_output_target_destroy(1207struct pipe_context *_pipe,1208struct pipe_stream_output_target *target)1209{1210struct trace_context *tr_ctx = trace_context(_pipe);1211struct pipe_context *pipe = tr_ctx->pipe;12121213trace_dump_call_begin("pipe_context", "stream_output_target_destroy");12141215trace_dump_arg(ptr, pipe);1216trace_dump_arg(ptr, target);12171218pipe->stream_output_target_destroy(pipe, target);12191220trace_dump_call_end();1221}122212231224static void1225trace_context_set_stream_output_targets(struct pipe_context *_pipe,1226unsigned num_targets,1227struct pipe_stream_output_target **tgs,1228const unsigned *offsets)1229{1230struct trace_context *tr_ctx = trace_context(_pipe);1231struct pipe_context *pipe = tr_ctx->pipe;12321233trace_dump_call_begin("pipe_context", "set_stream_output_targets");12341235trace_dump_arg(ptr, pipe);1236trace_dump_arg(uint, num_targets);1237trace_dump_arg_array(ptr, tgs, num_targets);1238trace_dump_arg_array(uint, offsets, num_targets);12391240pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets);12411242trace_dump_call_end();1243}124412451246static void1247trace_context_resource_copy_region(struct pipe_context *_pipe,1248struct pipe_resource *dst,1249unsigned dst_level,1250unsigned dstx, unsigned dsty, unsigned dstz,1251struct pipe_resource *src,1252unsigned src_level,1253const struct pipe_box *src_box)1254{1255struct trace_context *tr_ctx = trace_context(_pipe);1256struct pipe_context *pipe = tr_ctx->pipe;12571258trace_dump_call_begin("pipe_context", "resource_copy_region");12591260trace_dump_arg(ptr, pipe);1261trace_dump_arg(ptr, dst);1262trace_dump_arg(uint, dst_level);1263trace_dump_arg(uint, dstx);1264trace_dump_arg(uint, dsty);1265trace_dump_arg(uint, dstz);1266trace_dump_arg(ptr, src);1267trace_dump_arg(uint, src_level);1268trace_dump_arg(box, src_box);12691270pipe->resource_copy_region(pipe,1271dst, dst_level, dstx, dsty, dstz,1272src, src_level, src_box);12731274trace_dump_call_end();1275}127612771278static void1279trace_context_blit(struct pipe_context *_pipe,1280const struct pipe_blit_info *_info)1281{1282struct trace_context *tr_ctx = trace_context(_pipe);1283struct pipe_context *pipe = tr_ctx->pipe;1284struct pipe_blit_info info = *_info;12851286trace_dump_call_begin("pipe_context", "blit");12871288trace_dump_arg(ptr, pipe);1289trace_dump_arg(blit_info, _info);12901291pipe->blit(pipe, &info);12921293trace_dump_call_end();1294}129512961297static void1298trace_context_flush_resource(struct pipe_context *_pipe,1299struct pipe_resource *resource)1300{1301struct trace_context *tr_ctx = trace_context(_pipe);1302struct pipe_context *pipe = tr_ctx->pipe;13031304trace_dump_call_begin("pipe_context", "flush_resource");13051306trace_dump_arg(ptr, pipe);1307trace_dump_arg(ptr, resource);13081309pipe->flush_resource(pipe, resource);13101311trace_dump_call_end();1312}131313141315static void1316trace_context_clear(struct pipe_context *_pipe,1317unsigned buffers,1318const struct pipe_scissor_state *scissor_state,1319const union pipe_color_union *color,1320double depth,1321unsigned stencil)1322{1323struct trace_context *tr_ctx = trace_context(_pipe);1324struct pipe_context *pipe = tr_ctx->pipe;13251326trace_dump_call_begin("pipe_context", "clear");13271328trace_dump_arg(ptr, pipe);1329trace_dump_arg(uint, buffers);1330trace_dump_arg_begin("scissor_state");1331trace_dump_scissor_state(scissor_state);1332trace_dump_arg_end();1333trace_dump_arg_begin("color");1334if (color)1335trace_dump_array(float, color->f, 4);1336else1337trace_dump_null();1338trace_dump_arg_end();1339trace_dump_arg(float, depth);1340trace_dump_arg(uint, stencil);13411342pipe->clear(pipe, buffers, scissor_state, color, depth, stencil);13431344trace_dump_call_end();1345}134613471348static void1349trace_context_clear_render_target(struct pipe_context *_pipe,1350struct pipe_surface *dst,1351const union pipe_color_union *color,1352unsigned dstx, unsigned dsty,1353unsigned width, unsigned height,1354bool render_condition_enabled)1355{1356struct trace_context *tr_ctx = trace_context(_pipe);1357struct pipe_context *pipe = tr_ctx->pipe;13581359dst = trace_surface_unwrap(tr_ctx, dst);13601361trace_dump_call_begin("pipe_context", "clear_render_target");13621363trace_dump_arg(ptr, pipe);1364trace_dump_arg(ptr, dst);1365trace_dump_arg_array(float, color->f, 4);1366trace_dump_arg(uint, dstx);1367trace_dump_arg(uint, dsty);1368trace_dump_arg(uint, width);1369trace_dump_arg(uint, height);1370trace_dump_arg(bool, render_condition_enabled);13711372pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, height,1373render_condition_enabled);13741375trace_dump_call_end();1376}13771378static void1379trace_context_clear_depth_stencil(struct pipe_context *_pipe,1380struct pipe_surface *dst,1381unsigned clear_flags,1382double depth,1383unsigned stencil,1384unsigned dstx, unsigned dsty,1385unsigned width, unsigned height,1386bool render_condition_enabled)1387{1388struct trace_context *tr_ctx = trace_context(_pipe);1389struct pipe_context *pipe = tr_ctx->pipe;13901391dst = trace_surface_unwrap(tr_ctx, dst);13921393trace_dump_call_begin("pipe_context", "clear_depth_stencil");13941395trace_dump_arg(ptr, pipe);1396trace_dump_arg(ptr, dst);1397trace_dump_arg(uint, clear_flags);1398trace_dump_arg(float, depth);1399trace_dump_arg(uint, stencil);1400trace_dump_arg(uint, dstx);1401trace_dump_arg(uint, dsty);1402trace_dump_arg(uint, width);1403trace_dump_arg(uint, height);1404trace_dump_arg(bool, render_condition_enabled);14051406pipe->clear_depth_stencil(pipe, dst, clear_flags, depth, stencil,1407dstx, dsty, width, height,1408render_condition_enabled);14091410trace_dump_call_end();1411}14121413static inline void1414trace_context_clear_buffer(struct pipe_context *_pipe,1415struct pipe_resource *res,1416unsigned offset,1417unsigned size,1418const void *clear_value,1419int clear_value_size)1420{1421struct trace_context *tr_ctx = trace_context(_pipe);1422struct pipe_context *pipe = tr_ctx->pipe;142314241425trace_dump_call_begin("pipe_context", "clear_buffer");14261427trace_dump_arg(ptr, pipe);1428trace_dump_arg(ptr, res);1429trace_dump_arg(uint, offset);1430trace_dump_arg(uint, size);1431trace_dump_arg(ptr, clear_value);1432trace_dump_arg(int, clear_value_size);14331434pipe->clear_buffer(pipe, res, offset, size, clear_value, clear_value_size);14351436trace_dump_call_end();1437}14381439static inline void1440trace_context_clear_texture(struct pipe_context *_pipe,1441struct pipe_resource *res,1442unsigned level,1443const struct pipe_box *box,1444const void *data)1445{1446struct trace_context *tr_ctx = trace_context(_pipe);1447struct pipe_context *pipe = tr_ctx->pipe;144814491450trace_dump_call_begin("pipe_context", "clear_texture");14511452trace_dump_arg(ptr, pipe);1453trace_dump_arg(ptr, res);1454trace_dump_arg(uint, level);1455trace_dump_arg_begin("box");1456trace_dump_box(box);1457trace_dump_arg_end();1458trace_dump_arg(ptr, data);14591460pipe->clear_texture(pipe, res, level, box, data);14611462trace_dump_call_end();1463}14641465static void1466trace_context_flush(struct pipe_context *_pipe,1467struct pipe_fence_handle **fence,1468unsigned flags)1469{1470struct trace_context *tr_ctx = trace_context(_pipe);1471struct pipe_context *pipe = tr_ctx->pipe;14721473trace_dump_call_begin("pipe_context", "flush");14741475trace_dump_arg(ptr, pipe);1476trace_dump_arg(uint, flags);14771478pipe->flush(pipe, fence, flags);14791480if (fence)1481trace_dump_ret(ptr, *fence);14821483trace_dump_call_end();14841485if (flags & PIPE_FLUSH_END_OF_FRAME) {1486trace_dump_check_trigger();1487tr_ctx->seen_fb_state = false;1488}1489}149014911492static void1493trace_context_create_fence_fd(struct pipe_context *_pipe,1494struct pipe_fence_handle **fence,1495int fd,1496enum pipe_fd_type type)1497{1498struct trace_context *tr_ctx = trace_context(_pipe);1499struct pipe_context *pipe = tr_ctx->pipe;15001501trace_dump_call_begin("pipe_context", "create_fence_fd");15021503trace_dump_arg(ptr, pipe);1504trace_dump_arg(int, fd);1505trace_dump_arg(uint, type);15061507pipe->create_fence_fd(pipe, fence, fd, type);15081509if (fence)1510trace_dump_ret(ptr, *fence);15111512trace_dump_call_end();1513}151415151516static void1517trace_context_fence_server_sync(struct pipe_context *_pipe,1518struct pipe_fence_handle *fence)1519{1520struct trace_context *tr_ctx = trace_context(_pipe);1521struct pipe_context *pipe = tr_ctx->pipe;15221523trace_dump_call_begin("pipe_context", "fence_server_sync");15241525trace_dump_arg(ptr, pipe);1526trace_dump_arg(ptr, fence);15271528pipe->fence_server_sync(pipe, fence);15291530trace_dump_call_end();1531}153215331534static inline bool1535trace_context_generate_mipmap(struct pipe_context *_pipe,1536struct pipe_resource *res,1537enum pipe_format format,1538unsigned base_level,1539unsigned last_level,1540unsigned first_layer,1541unsigned last_layer)1542{1543struct trace_context *tr_ctx = trace_context(_pipe);1544struct pipe_context *pipe = tr_ctx->pipe;1545bool ret;15461547trace_dump_call_begin("pipe_context", "generate_mipmap");15481549trace_dump_arg(ptr, pipe);1550trace_dump_arg(ptr, res);15511552trace_dump_arg(format, format);1553trace_dump_arg(uint, base_level);1554trace_dump_arg(uint, last_level);1555trace_dump_arg(uint, first_layer);1556trace_dump_arg(uint, last_layer);15571558ret = pipe->generate_mipmap(pipe, res, format, base_level, last_level,1559first_layer, last_layer);15601561trace_dump_ret(bool, ret);1562trace_dump_call_end();15631564return ret;1565}156615671568static void1569trace_context_destroy(struct pipe_context *_pipe)1570{1571struct trace_context *tr_ctx = trace_context(_pipe);1572struct pipe_context *pipe = tr_ctx->pipe;15731574trace_dump_call_begin("pipe_context", "destroy");1575trace_dump_arg(ptr, pipe);1576trace_dump_call_end();15771578pipe->destroy(pipe);15791580ralloc_free(tr_ctx);1581}158215831584/********************************************************************1585* transfer1586*/158715881589static void *1590trace_context_transfer_map(struct pipe_context *_context,1591struct pipe_resource *resource,1592unsigned level,1593unsigned usage,1594const struct pipe_box *box,1595struct pipe_transfer **transfer)1596{1597struct trace_context *tr_context = trace_context(_context);1598struct pipe_context *pipe = tr_context->pipe;1599struct pipe_transfer *xfer = NULL;1600void *map;16011602if (resource->target == PIPE_BUFFER)1603map = pipe->buffer_map(pipe, resource, level, usage, box, &xfer);1604else1605map = pipe->texture_map(pipe, resource, level, usage, box, &xfer);1606if (!map)1607return NULL;1608*transfer = trace_transfer_create(tr_context, resource, xfer);1609trace_dump_call_begin("pipe_context", resource->target == PIPE_BUFFER ? "buffer_map" : "texture_map");16101611trace_dump_arg(ptr, pipe);1612trace_dump_arg(ptr, resource);1613trace_dump_arg(uint, level);1614trace_dump_arg(uint, usage);1615trace_dump_arg(box, box);16161617trace_dump_arg(ptr, xfer);1618trace_dump_ret(ptr, map);16191620trace_dump_call_end();16211622if (map) {1623if (usage & PIPE_MAP_WRITE) {1624trace_transfer(*transfer)->map = map;1625}1626}16271628return *transfer ? map : NULL;1629}16301631static void1632trace_context_transfer_flush_region( struct pipe_context *_context,1633struct pipe_transfer *_transfer,1634const struct pipe_box *box)1635{1636struct trace_context *tr_context = trace_context(_context);1637struct trace_transfer *tr_transfer = trace_transfer(_transfer);1638struct pipe_context *pipe = tr_context->pipe;1639struct pipe_transfer *transfer = tr_transfer->transfer;16401641trace_dump_call_begin("pipe_context", "transfer_flush_region");16421643trace_dump_arg(ptr, pipe);1644trace_dump_arg(ptr, transfer);1645trace_dump_arg(box, box);16461647trace_dump_call_end();16481649pipe->transfer_flush_region(pipe, transfer, box);1650}16511652static void1653trace_context_transfer_unmap(struct pipe_context *_context,1654struct pipe_transfer *_transfer)1655{1656struct trace_context *tr_ctx = trace_context(_context);1657struct trace_transfer *tr_trans = trace_transfer(_transfer);1658struct pipe_context *context = tr_ctx->pipe;1659struct pipe_transfer *transfer = tr_trans->transfer;166016611662trace_dump_call_begin("pipe_context", "transfer_unmap");16631664trace_dump_arg(ptr, context);1665trace_dump_arg(ptr, transfer);16661667trace_dump_call_end();16681669if (tr_trans->map && !tr_ctx->threaded) {1670/*1671* Fake a texture/buffer_subdata1672*/16731674struct pipe_resource *resource = transfer->resource;1675unsigned usage = transfer->usage;1676const struct pipe_box *box = &transfer->box;1677unsigned stride = transfer->stride;1678unsigned layer_stride = transfer->layer_stride;16791680if (resource->target == PIPE_BUFFER) {1681unsigned offset = box->x;1682unsigned size = box->width;16831684trace_dump_call_begin("pipe_context", "buffer_subdata");16851686trace_dump_arg(ptr, context);1687trace_dump_arg(ptr, resource);1688trace_dump_arg(uint, usage);1689trace_dump_arg(uint, offset);1690trace_dump_arg(uint, size);16911692trace_dump_arg_begin("data");1693trace_dump_box_bytes(tr_trans->map,1694resource,1695box,1696stride,1697layer_stride);1698trace_dump_arg_end();16991700trace_dump_arg(uint, stride);1701trace_dump_arg(uint, layer_stride);17021703trace_dump_call_end();1704} else {1705unsigned level = transfer->level;17061707trace_dump_call_begin("pipe_context", "texture_subdata");17081709trace_dump_arg(ptr, context);1710trace_dump_arg(ptr, resource);1711trace_dump_arg(uint, level);1712trace_dump_arg(uint, usage);1713trace_dump_arg(box, box);17141715trace_dump_arg_begin("data");1716trace_dump_box_bytes(tr_trans->map,1717resource,1718box,1719stride,1720layer_stride);1721trace_dump_arg_end();17221723trace_dump_arg(uint, stride);1724trace_dump_arg(uint, layer_stride);17251726trace_dump_call_end();1727}17281729tr_trans->map = NULL;1730}17311732if (transfer->resource->target == PIPE_BUFFER)1733context->buffer_unmap(context, transfer);1734else1735context->texture_unmap(context, transfer);1736trace_transfer_destroy(tr_ctx, tr_trans);1737}173817391740static void1741trace_context_buffer_subdata(struct pipe_context *_context,1742struct pipe_resource *resource,1743unsigned usage, unsigned offset,1744unsigned size, const void *data)1745{1746struct trace_context *tr_context = trace_context(_context);1747struct pipe_context *context = tr_context->pipe;1748struct pipe_box box;17491750trace_dump_call_begin("pipe_context", "buffer_subdata");17511752trace_dump_arg(ptr, context);1753trace_dump_arg(ptr, resource);1754trace_dump_arg(uint, usage);1755trace_dump_arg(uint, offset);1756trace_dump_arg(uint, size);17571758trace_dump_arg_begin("data");1759u_box_1d(offset, size, &box);1760trace_dump_box_bytes(data, resource, &box, 0, 0);1761trace_dump_arg_end();17621763trace_dump_call_end();17641765context->buffer_subdata(context, resource, usage, offset, size, data);1766}176717681769static void1770trace_context_texture_subdata(struct pipe_context *_context,1771struct pipe_resource *resource,1772unsigned level,1773unsigned usage,1774const struct pipe_box *box,1775const void *data,1776unsigned stride,1777unsigned layer_stride)1778{1779struct trace_context *tr_context = trace_context(_context);1780struct pipe_context *context = tr_context->pipe;17811782trace_dump_call_begin("pipe_context", "texture_subdata");17831784trace_dump_arg(ptr, context);1785trace_dump_arg(ptr, resource);1786trace_dump_arg(uint, level);1787trace_dump_arg(uint, usage);1788trace_dump_arg(box, box);17891790trace_dump_arg_begin("data");1791trace_dump_box_bytes(data,1792resource,1793box,1794stride,1795layer_stride);1796trace_dump_arg_end();17971798trace_dump_arg(uint, stride);1799trace_dump_arg(uint, layer_stride);18001801trace_dump_call_end();18021803context->texture_subdata(context, resource, level, usage, box,1804data, stride, layer_stride);1805}18061807static void1808trace_context_invalidate_resource(struct pipe_context *_context,1809struct pipe_resource *resource)1810{1811struct trace_context *tr_context = trace_context(_context);1812struct pipe_context *context = tr_context->pipe;18131814trace_dump_call_begin("pipe_context", "invalidate_resource");18151816trace_dump_arg(ptr, context);1817trace_dump_arg(ptr, resource);18181819trace_dump_call_end();18201821context->invalidate_resource(context, resource);1822}18231824static void1825trace_context_set_context_param(struct pipe_context *_context,1826enum pipe_context_param param,1827unsigned value)1828{1829struct trace_context *tr_context = trace_context(_context);1830struct pipe_context *context = tr_context->pipe;18311832trace_dump_call_begin("pipe_context", "set_context_param");18331834trace_dump_arg(ptr, context);1835trace_dump_arg(uint, param);1836trace_dump_arg(uint, value);18371838trace_dump_call_end();18391840context->set_context_param(context, param, value);1841}18421843static void1844trace_context_set_debug_callback(struct pipe_context *_context, const struct pipe_debug_callback *cb)1845{1846struct trace_context *tr_context = trace_context(_context);1847struct pipe_context *context = tr_context->pipe;18481849trace_dump_call_begin("pipe_context", "set_debug_callback");18501851trace_dump_arg(ptr, context);18521853trace_dump_call_end();18541855context->set_debug_callback(context, cb);1856}18571858static void1859trace_context_render_condition(struct pipe_context *_context,1860struct pipe_query *query,1861bool condition,1862enum pipe_render_cond_flag mode)1863{1864struct trace_context *tr_context = trace_context(_context);1865struct pipe_context *context = tr_context->pipe;18661867query = trace_query_unwrap(query);18681869trace_dump_call_begin("pipe_context", "render_condition");18701871trace_dump_arg(ptr, context);1872trace_dump_arg(ptr, query);1873trace_dump_arg(bool, condition);1874trace_dump_arg(uint, mode);18751876trace_dump_call_end();18771878context->render_condition(context, query, condition, mode);1879}188018811882static void1883trace_context_texture_barrier(struct pipe_context *_context, unsigned flags)1884{1885struct trace_context *tr_context = trace_context(_context);1886struct pipe_context *context = tr_context->pipe;18871888trace_dump_call_begin("pipe_context", "texture_barrier");18891890trace_dump_arg(ptr, context);1891trace_dump_arg(uint, flags);18921893trace_dump_call_end();18941895context->texture_barrier(context, flags);1896}189718981899static void1900trace_context_memory_barrier(struct pipe_context *_context,1901unsigned flags)1902{1903struct trace_context *tr_context = trace_context(_context);1904struct pipe_context *context = tr_context->pipe;19051906trace_dump_call_begin("pipe_context", "memory_barrier");1907trace_dump_arg(ptr, context);1908trace_dump_arg(uint, flags);1909trace_dump_call_end();19101911context->memory_barrier(context, flags);1912}191319141915static bool1916trace_context_resource_commit(struct pipe_context *_context,1917struct pipe_resource *resource,1918unsigned level, struct pipe_box *box, bool commit)1919{1920struct trace_context *tr_context = trace_context(_context);1921struct pipe_context *context = tr_context->pipe;19221923trace_dump_call_begin("pipe_context", "resource_commit");1924trace_dump_arg(ptr, context);1925trace_dump_arg(ptr, resource);1926trace_dump_arg(uint, level);1927trace_dump_arg(box, box);1928trace_dump_arg(bool, commit);1929trace_dump_call_end();19301931return context->resource_commit(context, resource, level, box, commit);1932}19331934static void1935trace_context_set_tess_state(struct pipe_context *_context,1936const float default_outer_level[4],1937const float default_inner_level[2])1938{1939struct trace_context *tr_context = trace_context(_context);1940struct pipe_context *context = tr_context->pipe;19411942trace_dump_call_begin("pipe_context", "set_tess_state");1943trace_dump_arg(ptr, context);1944trace_dump_arg_array(float, default_outer_level, 4);1945trace_dump_arg_array(float, default_inner_level, 2);1946trace_dump_call_end();19471948context->set_tess_state(context, default_outer_level, default_inner_level);1949}195019511952static void trace_context_set_shader_buffers(struct pipe_context *_context,1953enum pipe_shader_type shader,1954unsigned start, unsigned nr,1955const struct pipe_shader_buffer *buffers,1956unsigned writable_bitmask)1957{1958struct trace_context *tr_context = trace_context(_context);1959struct pipe_context *context = tr_context->pipe;19601961trace_dump_call_begin("pipe_context", "set_shader_buffers");1962trace_dump_arg(ptr, context);1963trace_dump_arg(uint, shader);1964trace_dump_arg(uint, start);1965trace_dump_arg_begin("buffers");1966trace_dump_struct_array(shader_buffer, buffers, nr);1967trace_dump_arg_end();1968trace_dump_arg(uint, writable_bitmask);1969trace_dump_call_end();19701971context->set_shader_buffers(context, shader, start, nr, buffers,1972writable_bitmask);1973}19741975static void trace_context_set_shader_images(struct pipe_context *_context,1976enum pipe_shader_type shader,1977unsigned start, unsigned nr,1978unsigned unbind_num_trailing_slots,1979const struct pipe_image_view *images)1980{1981struct trace_context *tr_context = trace_context(_context);1982struct pipe_context *context = tr_context->pipe;19831984trace_dump_call_begin("pipe_context", "set_shader_images");1985trace_dump_arg(ptr, context);1986trace_dump_arg(uint, shader);1987trace_dump_arg(uint, start);1988trace_dump_arg_begin("images");1989trace_dump_struct_array(image_view, images, nr);1990trace_dump_arg_end();1991trace_dump_arg(uint, unbind_num_trailing_slots);1992trace_dump_call_end();19931994context->set_shader_images(context, shader, start, nr,1995unbind_num_trailing_slots, images);1996}19971998static void trace_context_launch_grid(struct pipe_context *_pipe,1999const struct pipe_grid_info *info)2000{2001struct trace_context *tr_ctx = trace_context(_pipe);2002struct pipe_context *pipe = tr_ctx->pipe;20032004trace_dump_call_begin("pipe_context", "launch_grid");20052006trace_dump_arg(ptr, pipe);2007trace_dump_arg(grid_info, info);20082009trace_dump_trace_flush();20102011pipe->launch_grid(pipe, info);20122013trace_dump_call_end();2014}20152016static uint64_t trace_context_create_texture_handle(struct pipe_context *_pipe,2017struct pipe_sampler_view *view,2018const struct pipe_sampler_state *state)2019{2020struct trace_context *tr_ctx = trace_context(_pipe);2021struct pipe_context *pipe = tr_ctx->pipe;2022uint64_t handle;20232024trace_dump_call_begin("pipe_context", "create_texture_handle");2025trace_dump_arg(ptr, pipe);2026trace_dump_arg(ptr, view);2027trace_dump_arg_begin("state");2028trace_dump_arg(sampler_state, state);2029trace_dump_arg_end();20302031handle = pipe->create_texture_handle(pipe, view, state);20322033trace_dump_ret(uint, handle);2034trace_dump_call_end();20352036return handle;2037}20382039static void trace_context_delete_texture_handle(struct pipe_context *_pipe,2040uint64_t handle)2041{2042struct trace_context *tr_ctx = trace_context(_pipe);2043struct pipe_context *pipe = tr_ctx->pipe;20442045trace_dump_call_begin("pipe_context", "delete_texture_handle");2046trace_dump_arg(ptr, pipe);2047trace_dump_arg(uint, handle);2048trace_dump_call_end();20492050pipe->delete_texture_handle(pipe, handle);2051}20522053static void trace_context_make_texture_handle_resident(struct pipe_context *_pipe,2054uint64_t handle,2055bool resident)2056{2057struct trace_context *tr_ctx = trace_context(_pipe);2058struct pipe_context *pipe = tr_ctx->pipe;20592060trace_dump_call_begin("pipe_context", "make_texture_handle_resident");2061trace_dump_arg(ptr, pipe);2062trace_dump_arg(uint, handle);2063trace_dump_arg(bool, resident);2064trace_dump_call_end();20652066pipe->make_texture_handle_resident(pipe, handle, resident);2067}20682069static uint64_t trace_context_create_image_handle(struct pipe_context *_pipe,2070const struct pipe_image_view *image)2071{2072struct trace_context *tr_ctx = trace_context(_pipe);2073struct pipe_context *pipe = tr_ctx->pipe;2074uint64_t handle;20752076trace_dump_call_begin("pipe_context", "create_image_handle");2077trace_dump_arg(ptr, pipe);2078trace_dump_arg_begin("image");2079trace_dump_image_view(image);2080trace_dump_arg_end();20812082handle = pipe->create_image_handle(pipe, image);20832084trace_dump_ret(uint, handle);2085trace_dump_call_end();20862087return handle;2088}20892090static void trace_context_delete_image_handle(struct pipe_context *_pipe,2091uint64_t handle)2092{2093struct trace_context *tr_ctx = trace_context(_pipe);2094struct pipe_context *pipe = tr_ctx->pipe;20952096trace_dump_call_begin("pipe_context", "delete_image_handle");2097trace_dump_arg(ptr, pipe);2098trace_dump_arg(uint, handle);2099trace_dump_call_end();21002101pipe->delete_image_handle(pipe, handle);2102}21032104static void trace_context_make_image_handle_resident(struct pipe_context *_pipe,2105uint64_t handle,2106unsigned access,2107bool resident)2108{2109struct trace_context *tr_ctx = trace_context(_pipe);2110struct pipe_context *pipe = tr_ctx->pipe;21112112trace_dump_call_begin("pipe_context", "make_image_handle_resident");2113trace_dump_arg(ptr, pipe);2114trace_dump_arg(uint, handle);2115trace_dump_arg(uint, access);2116trace_dump_arg(bool, resident);2117trace_dump_call_end();21182119pipe->make_image_handle_resident(pipe, handle, access, resident);2120}21212122struct pipe_context *2123trace_context_create(struct trace_screen *tr_scr,2124struct pipe_context *pipe)2125{2126struct trace_context *tr_ctx;21272128if (!pipe)2129goto error1;21302131if (!trace_enabled())2132goto error1;21332134tr_ctx = ralloc(NULL, struct trace_context);2135if (!tr_ctx)2136goto error1;21372138_mesa_hash_table_init(&tr_ctx->blend_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);2139_mesa_hash_table_init(&tr_ctx->rasterizer_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);2140_mesa_hash_table_init(&tr_ctx->depth_stencil_alpha_states, tr_ctx, _mesa_hash_pointer, _mesa_key_pointer_equal);21412142tr_ctx->base.priv = pipe->priv; /* expose wrapped priv data */2143tr_ctx->base.screen = &tr_scr->base;2144tr_ctx->base.stream_uploader = pipe->stream_uploader;2145tr_ctx->base.const_uploader = pipe->const_uploader;21462147tr_ctx->base.destroy = trace_context_destroy;21482149#define TR_CTX_INIT(_member) \2150tr_ctx->base . _member = pipe -> _member ? trace_context_ ## _member : NULL21512152TR_CTX_INIT(draw_vbo);2153TR_CTX_INIT(render_condition);2154TR_CTX_INIT(create_query);2155TR_CTX_INIT(destroy_query);2156TR_CTX_INIT(begin_query);2157TR_CTX_INIT(end_query);2158TR_CTX_INIT(get_query_result);2159TR_CTX_INIT(set_active_query_state);2160TR_CTX_INIT(create_blend_state);2161TR_CTX_INIT(bind_blend_state);2162TR_CTX_INIT(delete_blend_state);2163TR_CTX_INIT(create_sampler_state);2164TR_CTX_INIT(bind_sampler_states);2165TR_CTX_INIT(delete_sampler_state);2166TR_CTX_INIT(create_rasterizer_state);2167TR_CTX_INIT(bind_rasterizer_state);2168TR_CTX_INIT(delete_rasterizer_state);2169TR_CTX_INIT(create_depth_stencil_alpha_state);2170TR_CTX_INIT(bind_depth_stencil_alpha_state);2171TR_CTX_INIT(delete_depth_stencil_alpha_state);2172TR_CTX_INIT(create_fs_state);2173TR_CTX_INIT(bind_fs_state);2174TR_CTX_INIT(delete_fs_state);2175TR_CTX_INIT(create_vs_state);2176TR_CTX_INIT(bind_vs_state);2177TR_CTX_INIT(delete_vs_state);2178TR_CTX_INIT(create_gs_state);2179TR_CTX_INIT(bind_gs_state);2180TR_CTX_INIT(delete_gs_state);2181TR_CTX_INIT(create_tcs_state);2182TR_CTX_INIT(bind_tcs_state);2183TR_CTX_INIT(delete_tcs_state);2184TR_CTX_INIT(create_tes_state);2185TR_CTX_INIT(bind_tes_state);2186TR_CTX_INIT(delete_tes_state);2187TR_CTX_INIT(create_compute_state);2188TR_CTX_INIT(bind_compute_state);2189TR_CTX_INIT(delete_compute_state);2190TR_CTX_INIT(create_vertex_elements_state);2191TR_CTX_INIT(bind_vertex_elements_state);2192TR_CTX_INIT(delete_vertex_elements_state);2193TR_CTX_INIT(set_blend_color);2194TR_CTX_INIT(set_stencil_ref);2195TR_CTX_INIT(set_clip_state);2196TR_CTX_INIT(set_sample_mask);2197TR_CTX_INIT(set_constant_buffer);2198TR_CTX_INIT(set_framebuffer_state);2199TR_CTX_INIT(set_inlinable_constants);2200TR_CTX_INIT(set_polygon_stipple);2201TR_CTX_INIT(set_min_samples);2202TR_CTX_INIT(set_scissor_states);2203TR_CTX_INIT(set_viewport_states);2204TR_CTX_INIT(set_sampler_views);2205TR_CTX_INIT(create_sampler_view);2206TR_CTX_INIT(sampler_view_destroy);2207TR_CTX_INIT(create_surface);2208TR_CTX_INIT(surface_destroy);2209TR_CTX_INIT(set_vertex_buffers);2210TR_CTX_INIT(create_stream_output_target);2211TR_CTX_INIT(stream_output_target_destroy);2212TR_CTX_INIT(set_stream_output_targets);2213TR_CTX_INIT(resource_copy_region);2214TR_CTX_INIT(blit);2215TR_CTX_INIT(flush_resource);2216TR_CTX_INIT(clear);2217TR_CTX_INIT(clear_render_target);2218TR_CTX_INIT(clear_depth_stencil);2219TR_CTX_INIT(clear_texture);2220TR_CTX_INIT(clear_buffer);2221TR_CTX_INIT(flush);2222TR_CTX_INIT(create_fence_fd);2223TR_CTX_INIT(fence_server_sync);2224TR_CTX_INIT(generate_mipmap);2225TR_CTX_INIT(texture_barrier);2226TR_CTX_INIT(memory_barrier);2227TR_CTX_INIT(resource_commit);2228TR_CTX_INIT(set_tess_state);2229TR_CTX_INIT(set_shader_buffers);2230TR_CTX_INIT(launch_grid);2231TR_CTX_INIT(set_shader_images);2232TR_CTX_INIT(create_texture_handle);2233TR_CTX_INIT(delete_texture_handle);2234TR_CTX_INIT(make_texture_handle_resident);2235TR_CTX_INIT(create_image_handle);2236TR_CTX_INIT(delete_image_handle);2237TR_CTX_INIT(make_image_handle_resident);22382239tr_ctx->base.buffer_map = tr_ctx->base.texture_map = trace_context_transfer_map;2240tr_ctx->base.buffer_unmap = tr_ctx->base.texture_unmap = trace_context_transfer_unmap;2241TR_CTX_INIT(transfer_flush_region);2242TR_CTX_INIT(buffer_subdata);2243TR_CTX_INIT(texture_subdata);2244TR_CTX_INIT(invalidate_resource);2245TR_CTX_INIT(set_context_param);2246TR_CTX_INIT(set_debug_callback);22472248#undef TR_CTX_INIT22492250tr_ctx->pipe = pipe;22512252return &tr_ctx->base;22532254error1:2255return pipe;2256}225722582259/**2260* Sanity checker: check that the given context really is a2261* trace context (and not the wrapped driver's context).2262*/2263void2264trace_context_check(const struct pipe_context *pipe)2265{2266ASSERTED struct trace_context *tr_ctx = (struct trace_context *) pipe;2267assert(tr_ctx->base.destroy == trace_context_destroy);2268}22692270/**2271* Threaded context is not wrapped, and so it may call fence functions directly2272*/2273struct pipe_context *2274trace_get_possibly_threaded_context(struct pipe_context *pipe)2275{2276return pipe->destroy == trace_context_destroy ? ((struct trace_context*)pipe)->pipe : pipe;2277}227822792280