Path: blob/21.2-virgl/src/gallium/auxiliary/driver_rbug/rbug_context.c
4561 views
/**************************************************************************1*2* Copyright 2010 VMware, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/262728#include "pipe/p_context.h"29#include "util/u_memory.h"30#include "util/u_inlines.h"31#include "util/simple_list.h"3233#include "rbug/rbug_context.h"3435#include "rbug_context.h"36#include "rbug_objects.h"373839static void40rbug_destroy(struct pipe_context *_pipe)41{42struct rbug_screen *rb_screen = rbug_screen(_pipe->screen);43struct rbug_context *rb_pipe = rbug_context(_pipe);44struct pipe_context *pipe = rb_pipe->pipe;4546rbug_screen_remove_from_list(rb_screen, contexts, rb_pipe);4748mtx_lock(&rb_pipe->call_mutex);49pipe->destroy(pipe);50rb_pipe->pipe = NULL;51mtx_unlock(&rb_pipe->call_mutex);5253FREE(rb_pipe);54}5556static void57rbug_draw_block_locked(struct rbug_context *rb_pipe, int flag)58{5960if (rb_pipe->draw_blocker & flag) {61rb_pipe->draw_blocked |= flag;62} else if ((rb_pipe->draw_rule.blocker & flag) &&63(rb_pipe->draw_blocker & RBUG_BLOCK_RULE)) {64unsigned k;65bool block = false;66unsigned sh;6768debug_printf("%s (%p %p) (%p %p) (%p %u) (%p %u)\n", __FUNCTION__,69(void *) rb_pipe->draw_rule.shader[PIPE_SHADER_FRAGMENT],70(void *) rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT],71(void *) rb_pipe->draw_rule.shader[PIPE_SHADER_VERTEX],72(void *) rb_pipe->curr.shader[PIPE_SHADER_VERTEX],73(void *) rb_pipe->draw_rule.surf, 0,74(void *) rb_pipe->draw_rule.texture, 0);75for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {76if (rb_pipe->draw_rule.shader[sh] &&77rb_pipe->draw_rule.shader[sh] == rb_pipe->curr.shader[sh])78block = true;79}8081if (rb_pipe->draw_rule.surf &&82rb_pipe->draw_rule.surf == rb_pipe->curr.zsbuf)83block = true;84if (rb_pipe->draw_rule.surf)85for (k = 0; k < rb_pipe->curr.nr_cbufs; k++)86if (rb_pipe->draw_rule.surf == rb_pipe->curr.cbufs[k])87block = true;88if (rb_pipe->draw_rule.texture) {89for (sh = 0; sh < ARRAY_SIZE(rb_pipe->curr.num_views); sh++) {90for (k = 0; k < rb_pipe->curr.num_views[sh]; k++) {91if (rb_pipe->draw_rule.texture == rb_pipe->curr.texs[sh][k]) {92block = true;93sh = PIPE_SHADER_TYPES; /* to break out of both loops */94break;95}96}97}98}99100if (block)101rb_pipe->draw_blocked |= (flag | RBUG_BLOCK_RULE);102}103104if (rb_pipe->draw_blocked)105rbug_notify_draw_blocked(rb_pipe);106107/* wait for rbug to clear the blocked flag */108while (rb_pipe->draw_blocked & flag) {109rb_pipe->draw_blocked |= flag;110cnd_wait(&rb_pipe->draw_cond, &rb_pipe->draw_mutex);111}112113}114115static void116rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *_info,117unsigned _drawid_offset,118const struct pipe_draw_indirect_info *_indirect,119const struct pipe_draw_start_count_bias *draws,120unsigned num_draws)121{122struct rbug_context *rb_pipe = rbug_context(_pipe);123struct pipe_context *pipe = rb_pipe->pipe;124struct pipe_draw_info info;125126info = *_info;127if(_info->index_size && !_info->has_user_indices)128info.index.resource = rbug_resource_unwrap(_info->index.resource);129130mtx_lock(&rb_pipe->draw_mutex);131rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_BEFORE);132133mtx_lock(&rb_pipe->call_mutex);134/* XXX loop over PIPE_SHADER_x here */135if (!(rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] && rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT]->disabled) &&136!(rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] && rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY]->disabled) &&137!(rb_pipe->curr.shader[PIPE_SHADER_VERTEX] && rb_pipe->curr.shader[PIPE_SHADER_VERTEX]->disabled))138pipe->draw_vbo(pipe, &info, _drawid_offset, _indirect, draws, num_draws);139mtx_unlock(&rb_pipe->call_mutex);140141rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_AFTER);142mtx_unlock(&rb_pipe->draw_mutex);143}144145static struct pipe_query *146rbug_create_query(struct pipe_context *_pipe,147unsigned query_type,148unsigned index)149{150struct rbug_context *rb_pipe = rbug_context(_pipe);151struct pipe_context *pipe = rb_pipe->pipe;152struct pipe_query *query;153154mtx_lock(&rb_pipe->call_mutex);155query = pipe->create_query(pipe,156query_type,157index);158mtx_unlock(&rb_pipe->call_mutex);159return query;160}161162static void163rbug_destroy_query(struct pipe_context *_pipe,164struct pipe_query *query)165{166struct rbug_context *rb_pipe = rbug_context(_pipe);167struct pipe_context *pipe = rb_pipe->pipe;168169mtx_lock(&rb_pipe->call_mutex);170pipe->destroy_query(pipe,171query);172mtx_unlock(&rb_pipe->call_mutex);173}174175static bool176rbug_begin_query(struct pipe_context *_pipe,177struct pipe_query *query)178{179struct rbug_context *rb_pipe = rbug_context(_pipe);180struct pipe_context *pipe = rb_pipe->pipe;181bool ret;182183mtx_lock(&rb_pipe->call_mutex);184ret = pipe->begin_query(pipe, query);185mtx_unlock(&rb_pipe->call_mutex);186return ret;187}188189static bool190rbug_end_query(struct pipe_context *_pipe,191struct pipe_query *query)192{193struct rbug_context *rb_pipe = rbug_context(_pipe);194struct pipe_context *pipe = rb_pipe->pipe;195bool ret;196197mtx_lock(&rb_pipe->call_mutex);198ret = pipe->end_query(pipe,199query);200mtx_unlock(&rb_pipe->call_mutex);201202return ret;203}204205static bool206rbug_get_query_result(struct pipe_context *_pipe,207struct pipe_query *query,208bool wait,209union pipe_query_result *result)210{211struct rbug_context *rb_pipe = rbug_context(_pipe);212struct pipe_context *pipe = rb_pipe->pipe;213bool ret;214215mtx_lock(&rb_pipe->call_mutex);216ret = pipe->get_query_result(pipe,217query,218wait,219result);220mtx_unlock(&rb_pipe->call_mutex);221222return ret;223}224225static void226rbug_set_active_query_state(struct pipe_context *_pipe, bool enable)227{228struct rbug_context *rb_pipe = rbug_context(_pipe);229struct pipe_context *pipe = rb_pipe->pipe;230231mtx_lock(&rb_pipe->call_mutex);232pipe->set_active_query_state(pipe, enable);233mtx_unlock(&rb_pipe->call_mutex);234}235236static void *237rbug_create_blend_state(struct pipe_context *_pipe,238const struct pipe_blend_state *blend)239{240struct rbug_context *rb_pipe = rbug_context(_pipe);241struct pipe_context *pipe = rb_pipe->pipe;242void *ret;243244mtx_lock(&rb_pipe->call_mutex);245ret = pipe->create_blend_state(pipe,246blend);247mtx_unlock(&rb_pipe->call_mutex);248249return ret;250}251252static void253rbug_bind_blend_state(struct pipe_context *_pipe,254void *blend)255{256struct rbug_context *rb_pipe = rbug_context(_pipe);257struct pipe_context *pipe = rb_pipe->pipe;258259mtx_lock(&rb_pipe->call_mutex);260pipe->bind_blend_state(pipe,261blend);262mtx_unlock(&rb_pipe->call_mutex);263}264265static void266rbug_delete_blend_state(struct pipe_context *_pipe,267void *blend)268{269struct rbug_context *rb_pipe = rbug_context(_pipe);270struct pipe_context *pipe = rb_pipe->pipe;271272mtx_lock(&rb_pipe->call_mutex);273pipe->delete_blend_state(pipe,274blend);275mtx_unlock(&rb_pipe->call_mutex);276}277278static void *279rbug_create_sampler_state(struct pipe_context *_pipe,280const struct pipe_sampler_state *sampler)281{282struct rbug_context *rb_pipe = rbug_context(_pipe);283struct pipe_context *pipe = rb_pipe->pipe;284void *ret;285286mtx_lock(&rb_pipe->call_mutex);287ret = pipe->create_sampler_state(pipe,288sampler);289mtx_unlock(&rb_pipe->call_mutex);290291return ret;292}293294static void295rbug_bind_sampler_states(struct pipe_context *_pipe,296enum pipe_shader_type shader,297unsigned start, unsigned count,298void **samplers)299{300struct rbug_context *rb_pipe = rbug_context(_pipe);301struct pipe_context *pipe = rb_pipe->pipe;302303mtx_lock(&rb_pipe->call_mutex);304pipe->bind_sampler_states(pipe, shader, start, count, samplers);305mtx_unlock(&rb_pipe->call_mutex);306}307308static void309rbug_delete_sampler_state(struct pipe_context *_pipe,310void *sampler)311{312struct rbug_context *rb_pipe = rbug_context(_pipe);313struct pipe_context *pipe = rb_pipe->pipe;314315mtx_lock(&rb_pipe->call_mutex);316pipe->delete_sampler_state(pipe,317sampler);318mtx_unlock(&rb_pipe->call_mutex);319}320321static void *322rbug_create_rasterizer_state(struct pipe_context *_pipe,323const struct pipe_rasterizer_state *rasterizer)324{325struct rbug_context *rb_pipe = rbug_context(_pipe);326struct pipe_context *pipe = rb_pipe->pipe;327void *ret;328329mtx_lock(&rb_pipe->call_mutex);330ret = pipe->create_rasterizer_state(pipe,331rasterizer);332mtx_unlock(&rb_pipe->call_mutex);333334return ret;335}336337static void338rbug_bind_rasterizer_state(struct pipe_context *_pipe,339void *rasterizer)340{341struct rbug_context *rb_pipe = rbug_context(_pipe);342struct pipe_context *pipe = rb_pipe->pipe;343344mtx_lock(&rb_pipe->call_mutex);345pipe->bind_rasterizer_state(pipe,346rasterizer);347mtx_unlock(&rb_pipe->call_mutex);348}349350static void351rbug_delete_rasterizer_state(struct pipe_context *_pipe,352void *rasterizer)353{354struct rbug_context *rb_pipe = rbug_context(_pipe);355struct pipe_context *pipe = rb_pipe->pipe;356357mtx_lock(&rb_pipe->call_mutex);358pipe->delete_rasterizer_state(pipe,359rasterizer);360mtx_unlock(&rb_pipe->call_mutex);361}362363static void *364rbug_create_depth_stencil_alpha_state(struct pipe_context *_pipe,365const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)366{367struct rbug_context *rb_pipe = rbug_context(_pipe);368struct pipe_context *pipe = rb_pipe->pipe;369void *ret;370371mtx_lock(&rb_pipe->call_mutex);372ret = pipe->create_depth_stencil_alpha_state(pipe,373depth_stencil_alpha);374mtx_unlock(&rb_pipe->call_mutex);375376return ret;377}378379static void380rbug_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,381void *depth_stencil_alpha)382{383struct rbug_context *rb_pipe = rbug_context(_pipe);384struct pipe_context *pipe = rb_pipe->pipe;385386mtx_lock(&rb_pipe->call_mutex);387pipe->bind_depth_stencil_alpha_state(pipe,388depth_stencil_alpha);389mtx_unlock(&rb_pipe->call_mutex);390}391392static void393rbug_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,394void *depth_stencil_alpha)395{396struct rbug_context *rb_pipe = rbug_context(_pipe);397struct pipe_context *pipe = rb_pipe->pipe;398399mtx_lock(&rb_pipe->call_mutex);400pipe->delete_depth_stencil_alpha_state(pipe,401depth_stencil_alpha);402mtx_unlock(&rb_pipe->call_mutex);403}404405static void *406rbug_create_fs_state(struct pipe_context *_pipe,407const struct pipe_shader_state *state)408{409struct rbug_context *rb_pipe = rbug_context(_pipe);410struct pipe_context *pipe = rb_pipe->pipe;411void *result;412413mtx_lock(&rb_pipe->call_mutex);414result = pipe->create_fs_state(pipe, state);415mtx_unlock(&rb_pipe->call_mutex);416417if (!result)418return NULL;419420return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_FRAGMENT);421}422423static void424rbug_bind_fs_state(struct pipe_context *_pipe,425void *_fs)426{427struct rbug_context *rb_pipe = rbug_context(_pipe);428struct pipe_context *pipe = rb_pipe->pipe;429void *fs;430431mtx_lock(&rb_pipe->call_mutex);432433fs = rbug_shader_unwrap(_fs);434rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] = rbug_shader(_fs);435pipe->bind_fs_state(pipe,436fs);437438mtx_unlock(&rb_pipe->call_mutex);439}440441static void442rbug_delete_fs_state(struct pipe_context *_pipe,443void *_fs)444{445struct rbug_context *rb_pipe = rbug_context(_pipe);446struct rbug_shader *rb_shader = rbug_shader(_fs);447448mtx_lock(&rb_pipe->call_mutex);449rbug_shader_destroy(rb_pipe, rb_shader);450mtx_unlock(&rb_pipe->call_mutex);451}452453static void *454rbug_create_vs_state(struct pipe_context *_pipe,455const struct pipe_shader_state *state)456{457struct rbug_context *rb_pipe = rbug_context(_pipe);458struct pipe_context *pipe = rb_pipe->pipe;459void *result;460461mtx_lock(&rb_pipe->call_mutex);462result = pipe->create_vs_state(pipe, state);463mtx_unlock(&rb_pipe->call_mutex);464465if (!result)466return NULL;467468return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_VERTEX);469}470471static void472rbug_bind_vs_state(struct pipe_context *_pipe,473void *_vs)474{475struct rbug_context *rb_pipe = rbug_context(_pipe);476struct pipe_context *pipe = rb_pipe->pipe;477void *vs;478479mtx_lock(&rb_pipe->call_mutex);480481vs = rbug_shader_unwrap(_vs);482rb_pipe->curr.shader[PIPE_SHADER_VERTEX] = rbug_shader(_vs);483pipe->bind_vs_state(pipe,484vs);485486mtx_unlock(&rb_pipe->call_mutex);487}488489static void490rbug_delete_vs_state(struct pipe_context *_pipe,491void *_vs)492{493struct rbug_context *rb_pipe = rbug_context(_pipe);494struct rbug_shader *rb_shader = rbug_shader(_vs);495496mtx_lock(&rb_pipe->call_mutex);497rbug_shader_destroy(rb_pipe, rb_shader);498mtx_unlock(&rb_pipe->call_mutex);499}500501static void *502rbug_create_gs_state(struct pipe_context *_pipe,503const struct pipe_shader_state *state)504{505struct rbug_context *rb_pipe = rbug_context(_pipe);506struct pipe_context *pipe = rb_pipe->pipe;507void *result;508509mtx_lock(&rb_pipe->call_mutex);510result = pipe->create_gs_state(pipe, state);511mtx_unlock(&rb_pipe->call_mutex);512513if (!result)514return NULL;515516return rbug_shader_create(rb_pipe, state, result, RBUG_SHADER_GEOM);517}518519static void520rbug_bind_gs_state(struct pipe_context *_pipe,521void *_gs)522{523struct rbug_context *rb_pipe = rbug_context(_pipe);524struct pipe_context *pipe = rb_pipe->pipe;525void *gs;526527mtx_lock(&rb_pipe->call_mutex);528529gs = rbug_shader_unwrap(_gs);530rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] = rbug_shader(_gs);531pipe->bind_gs_state(pipe,532gs);533534mtx_unlock(&rb_pipe->call_mutex);535}536537static void538rbug_delete_gs_state(struct pipe_context *_pipe,539void *_gs)540{541struct rbug_context *rb_pipe = rbug_context(_pipe);542struct rbug_shader *rb_shader = rbug_shader(_gs);543544mtx_lock(&rb_pipe->call_mutex);545rbug_shader_destroy(rb_pipe, rb_shader);546mtx_unlock(&rb_pipe->call_mutex);547}548549static void *550rbug_create_vertex_elements_state(struct pipe_context *_pipe,551unsigned num_elements,552const struct pipe_vertex_element *vertex_elements)553{554struct rbug_context *rb_pipe = rbug_context(_pipe);555struct pipe_context *pipe = rb_pipe->pipe;556void *ret;557558mtx_lock(&rb_pipe->call_mutex);559ret = pipe->create_vertex_elements_state(pipe,560num_elements,561vertex_elements);562mtx_unlock(&rb_pipe->call_mutex);563564return ret;565}566567static void568rbug_bind_vertex_elements_state(struct pipe_context *_pipe,569void *velems)570{571struct rbug_context *rb_pipe = rbug_context(_pipe);572struct pipe_context *pipe = rb_pipe->pipe;573574mtx_lock(&rb_pipe->call_mutex);575pipe->bind_vertex_elements_state(pipe,576velems);577mtx_unlock(&rb_pipe->call_mutex);578}579580static void581rbug_delete_vertex_elements_state(struct pipe_context *_pipe,582void *velems)583{584struct rbug_context *rb_pipe = rbug_context(_pipe);585struct pipe_context *pipe = rb_pipe->pipe;586587mtx_lock(&rb_pipe->call_mutex);588pipe->delete_vertex_elements_state(pipe,589velems);590mtx_unlock(&rb_pipe->call_mutex);591}592593static void594rbug_set_blend_color(struct pipe_context *_pipe,595const struct pipe_blend_color *blend_color)596{597struct rbug_context *rb_pipe = rbug_context(_pipe);598struct pipe_context *pipe = rb_pipe->pipe;599600mtx_lock(&rb_pipe->call_mutex);601pipe->set_blend_color(pipe,602blend_color);603mtx_unlock(&rb_pipe->call_mutex);604}605606static void607rbug_set_stencil_ref(struct pipe_context *_pipe,608const struct pipe_stencil_ref stencil_ref)609{610struct rbug_context *rb_pipe = rbug_context(_pipe);611struct pipe_context *pipe = rb_pipe->pipe;612613mtx_lock(&rb_pipe->call_mutex);614pipe->set_stencil_ref(pipe,615stencil_ref);616mtx_unlock(&rb_pipe->call_mutex);617}618619static void620rbug_set_clip_state(struct pipe_context *_pipe,621const struct pipe_clip_state *clip)622{623struct rbug_context *rb_pipe = rbug_context(_pipe);624struct pipe_context *pipe = rb_pipe->pipe;625626mtx_lock(&rb_pipe->call_mutex);627pipe->set_clip_state(pipe,628clip);629mtx_unlock(&rb_pipe->call_mutex);630}631632static void633rbug_set_constant_buffer(struct pipe_context *_pipe,634enum pipe_shader_type shader,635uint index, bool take_ownership,636const struct pipe_constant_buffer *_cb)637{638struct rbug_context *rb_pipe = rbug_context(_pipe);639struct pipe_context *pipe = rb_pipe->pipe;640struct pipe_constant_buffer cb;641642/* XXX hmm? unwrap the input state */643if (_cb) {644cb = *_cb;645cb.buffer = rbug_resource_unwrap(_cb->buffer);646}647648mtx_lock(&rb_pipe->call_mutex);649pipe->set_constant_buffer(pipe,650shader,651index, take_ownership,652_cb ? &cb : NULL);653mtx_unlock(&rb_pipe->call_mutex);654}655656static void657rbug_set_framebuffer_state(struct pipe_context *_pipe,658const struct pipe_framebuffer_state *_state)659{660struct rbug_context *rb_pipe = rbug_context(_pipe);661struct pipe_context *pipe = rb_pipe->pipe;662struct pipe_framebuffer_state unwrapped_state;663struct pipe_framebuffer_state *state = NULL;664unsigned i;665666/* must protect curr status */667mtx_lock(&rb_pipe->call_mutex);668669rb_pipe->curr.nr_cbufs = 0;670memset(rb_pipe->curr.cbufs, 0, sizeof(rb_pipe->curr.cbufs));671rb_pipe->curr.zsbuf = NULL;672673/* unwrap the input state */674if (_state) {675memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));676677rb_pipe->curr.nr_cbufs = _state->nr_cbufs;678for(i = 0; i < _state->nr_cbufs; i++) {679unwrapped_state.cbufs[i] = rbug_surface_unwrap(_state->cbufs[i]);680if (_state->cbufs[i])681rb_pipe->curr.cbufs[i] = rbug_resource(_state->cbufs[i]->texture);682}683unwrapped_state.zsbuf = rbug_surface_unwrap(_state->zsbuf);684if (_state->zsbuf)685rb_pipe->curr.zsbuf = rbug_resource(_state->zsbuf->texture);686state = &unwrapped_state;687}688689pipe->set_framebuffer_state(pipe,690state);691692mtx_unlock(&rb_pipe->call_mutex);693}694695static void696rbug_set_polygon_stipple(struct pipe_context *_pipe,697const struct pipe_poly_stipple *poly_stipple)698{699struct rbug_context *rb_pipe = rbug_context(_pipe);700struct pipe_context *pipe = rb_pipe->pipe;701702mtx_lock(&rb_pipe->call_mutex);703pipe->set_polygon_stipple(pipe,704poly_stipple);705mtx_unlock(&rb_pipe->call_mutex);706}707708static void709rbug_set_scissor_states(struct pipe_context *_pipe,710unsigned start_slot,711unsigned num_scissors,712const struct pipe_scissor_state *scissor)713{714struct rbug_context *rb_pipe = rbug_context(_pipe);715struct pipe_context *pipe = rb_pipe->pipe;716717mtx_lock(&rb_pipe->call_mutex);718pipe->set_scissor_states(pipe, start_slot, num_scissors, scissor);719mtx_unlock(&rb_pipe->call_mutex);720}721722static void723rbug_set_viewport_states(struct pipe_context *_pipe,724unsigned start_slot,725unsigned num_viewports,726const struct pipe_viewport_state *viewport)727{728struct rbug_context *rb_pipe = rbug_context(_pipe);729struct pipe_context *pipe = rb_pipe->pipe;730731mtx_lock(&rb_pipe->call_mutex);732pipe->set_viewport_states(pipe, start_slot, num_viewports, viewport);733mtx_unlock(&rb_pipe->call_mutex);734}735736static void737rbug_set_sampler_views(struct pipe_context *_pipe,738enum pipe_shader_type shader,739unsigned start,740unsigned num,741unsigned unbind_num_trailing_slots,742struct pipe_sampler_view **_views)743{744struct rbug_context *rb_pipe = rbug_context(_pipe);745struct pipe_context *pipe = rb_pipe->pipe;746struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SHADER_SAMPLER_VIEWS];747struct pipe_sampler_view **views = NULL;748unsigned i;749750assert(start == 0); /* XXX fix */751752/* must protect curr status */753mtx_lock(&rb_pipe->call_mutex);754755rb_pipe->curr.num_views[shader] = 0;756memset(rb_pipe->curr.views[shader], 0, sizeof(rb_pipe->curr.views[shader]));757memset(rb_pipe->curr.texs[shader], 0, sizeof(rb_pipe->curr.texs[shader]));758memset(unwrapped_views, 0, sizeof(unwrapped_views));759760if (_views) {761rb_pipe->curr.num_views[shader] = num;762for (i = 0; i < num; i++) {763rb_pipe->curr.views[shader][i] = rbug_sampler_view(_views[i]);764rb_pipe->curr.texs[shader][i] = rbug_resource(_views[i] ? _views[i]->texture : NULL);765unwrapped_views[i] = rbug_sampler_view_unwrap(_views[i]);766}767views = unwrapped_views;768}769770pipe->set_sampler_views(pipe, shader, start, num,771unbind_num_trailing_slots, views);772773mtx_unlock(&rb_pipe->call_mutex);774}775776static void777rbug_set_vertex_buffers(struct pipe_context *_pipe,778unsigned start_slot, unsigned num_buffers,779unsigned unbind_num_trailing_slots,780bool take_ownership,781const struct pipe_vertex_buffer *_buffers)782{783struct rbug_context *rb_pipe = rbug_context(_pipe);784struct pipe_context *pipe = rb_pipe->pipe;785struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];786struct pipe_vertex_buffer *buffers = NULL;787unsigned i;788789mtx_lock(&rb_pipe->call_mutex);790791if (num_buffers && _buffers) {792memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));793for (i = 0; i < num_buffers; i++) {794if (!_buffers[i].is_user_buffer)795unwrapped_buffers[i].buffer.resource =796rbug_resource_unwrap(_buffers[i].buffer.resource);797}798buffers = unwrapped_buffers;799}800801pipe->set_vertex_buffers(pipe, start_slot,802num_buffers, unbind_num_trailing_slots,803take_ownership, buffers);804805mtx_unlock(&rb_pipe->call_mutex);806}807808static void809rbug_set_sample_mask(struct pipe_context *_pipe,810unsigned sample_mask)811{812struct rbug_context *rb_pipe = rbug_context(_pipe);813struct pipe_context *pipe = rb_pipe->pipe;814815mtx_lock(&rb_pipe->call_mutex);816pipe->set_sample_mask(pipe, sample_mask);817mtx_unlock(&rb_pipe->call_mutex);818}819820static struct pipe_stream_output_target *821rbug_create_stream_output_target(struct pipe_context *_pipe,822struct pipe_resource *_res,823unsigned buffer_offset, unsigned buffer_size)824{825struct rbug_context *rb_pipe = rbug_context(_pipe);826struct pipe_context *pipe = rb_pipe->pipe;827struct pipe_resource *res = rbug_resource_unwrap(_res);828struct pipe_stream_output_target *target;829830mtx_lock(&rb_pipe->call_mutex);831target = pipe->create_stream_output_target(pipe, res, buffer_offset,832buffer_size);833mtx_unlock(&rb_pipe->call_mutex);834return target;835}836837static void838rbug_stream_output_target_destroy(struct pipe_context *_pipe,839struct pipe_stream_output_target *target)840{841struct rbug_context *rb_pipe = rbug_context(_pipe);842struct pipe_context *pipe = rb_pipe->pipe;843844mtx_lock(&rb_pipe->call_mutex);845pipe->stream_output_target_destroy(pipe, target);846mtx_unlock(&rb_pipe->call_mutex);847}848849static void850rbug_set_stream_output_targets(struct pipe_context *_pipe,851unsigned num_targets,852struct pipe_stream_output_target **targets,853const unsigned *offsets)854{855struct rbug_context *rb_pipe = rbug_context(_pipe);856struct pipe_context *pipe = rb_pipe->pipe;857858mtx_lock(&rb_pipe->call_mutex);859pipe->set_stream_output_targets(pipe, num_targets, targets, offsets);860mtx_unlock(&rb_pipe->call_mutex);861}862863static void864rbug_resource_copy_region(struct pipe_context *_pipe,865struct pipe_resource *_dst,866unsigned dst_level,867unsigned dstx,868unsigned dsty,869unsigned dstz,870struct pipe_resource *_src,871unsigned src_level,872const struct pipe_box *src_box)873{874struct rbug_context *rb_pipe = rbug_context(_pipe);875struct rbug_resource *rb_resource_dst = rbug_resource(_dst);876struct rbug_resource *rb_resource_src = rbug_resource(_src);877struct pipe_context *pipe = rb_pipe->pipe;878struct pipe_resource *dst = rb_resource_dst->resource;879struct pipe_resource *src = rb_resource_src->resource;880881mtx_lock(&rb_pipe->call_mutex);882pipe->resource_copy_region(pipe,883dst,884dst_level,885dstx,886dsty,887dstz,888src,889src_level,890src_box);891mtx_unlock(&rb_pipe->call_mutex);892}893894static void895rbug_blit(struct pipe_context *_pipe, const struct pipe_blit_info *_blit_info)896{897struct rbug_context *rb_pipe = rbug_context(_pipe);898struct rbug_resource *rb_resource_dst = rbug_resource(_blit_info->dst.resource);899struct rbug_resource *rb_resource_src = rbug_resource(_blit_info->src.resource);900struct pipe_context *pipe = rb_pipe->pipe;901struct pipe_resource *dst = rb_resource_dst->resource;902struct pipe_resource *src = rb_resource_src->resource;903struct pipe_blit_info blit_info;904905blit_info = *_blit_info;906blit_info.dst.resource = dst;907blit_info.src.resource = src;908909mtx_lock(&rb_pipe->call_mutex);910pipe->blit(pipe, &blit_info);911mtx_unlock(&rb_pipe->call_mutex);912}913914static void915rbug_flush_resource(struct pipe_context *_pipe,916struct pipe_resource *_res)917{918struct rbug_context *rb_pipe = rbug_context(_pipe);919struct rbug_resource *rb_resource_res = rbug_resource(_res);920struct pipe_context *pipe = rb_pipe->pipe;921struct pipe_resource *res = rb_resource_res->resource;922923mtx_lock(&rb_pipe->call_mutex);924pipe->flush_resource(pipe, res);925mtx_unlock(&rb_pipe->call_mutex);926}927928static void929rbug_clear(struct pipe_context *_pipe,930unsigned buffers,931const struct pipe_scissor_state *scissor_state,932const union pipe_color_union *color,933double depth,934unsigned stencil)935{936struct rbug_context *rb_pipe = rbug_context(_pipe);937struct pipe_context *pipe = rb_pipe->pipe;938939mtx_lock(&rb_pipe->call_mutex);940pipe->clear(pipe,941buffers,942scissor_state,943color,944depth,945stencil);946mtx_unlock(&rb_pipe->call_mutex);947}948949static void950rbug_clear_render_target(struct pipe_context *_pipe,951struct pipe_surface *_dst,952const union pipe_color_union *color,953unsigned dstx, unsigned dsty,954unsigned width, unsigned height,955bool render_condition_enabled)956{957struct rbug_context *rb_pipe = rbug_context(_pipe);958struct rbug_surface *rb_surface_dst = rbug_surface(_dst);959struct pipe_context *pipe = rb_pipe->pipe;960struct pipe_surface *dst = rb_surface_dst->surface;961962mtx_lock(&rb_pipe->call_mutex);963pipe->clear_render_target(pipe,964dst,965color,966dstx,967dsty,968width,969height,970render_condition_enabled);971mtx_unlock(&rb_pipe->call_mutex);972}973974static void975rbug_clear_depth_stencil(struct pipe_context *_pipe,976struct pipe_surface *_dst,977unsigned clear_flags,978double depth,979unsigned stencil,980unsigned dstx, unsigned dsty,981unsigned width, unsigned height,982bool render_condition_enabled)983{984struct rbug_context *rb_pipe = rbug_context(_pipe);985struct rbug_surface *rb_surface_dst = rbug_surface(_dst);986struct pipe_context *pipe = rb_pipe->pipe;987struct pipe_surface *dst = rb_surface_dst->surface;988989mtx_lock(&rb_pipe->call_mutex);990pipe->clear_depth_stencil(pipe,991dst,992clear_flags,993depth,994stencil,995dstx,996dsty,997width,998height,999render_condition_enabled);1000mtx_unlock(&rb_pipe->call_mutex);1001}10021003static void1004rbug_flush(struct pipe_context *_pipe,1005struct pipe_fence_handle **fence,1006unsigned flags)1007{1008struct rbug_context *rb_pipe = rbug_context(_pipe);1009struct pipe_context *pipe = rb_pipe->pipe;10101011mtx_lock(&rb_pipe->call_mutex);1012pipe->flush(pipe, fence, flags);1013mtx_unlock(&rb_pipe->call_mutex);1014}10151016static void1017rbug_create_fence_fd(struct pipe_context *_pipe,1018struct pipe_fence_handle **fence, int fd,1019enum pipe_fd_type type)1020{1021struct rbug_context *rb_pipe = rbug_context(_pipe);1022struct pipe_context *pipe = rb_pipe->pipe;10231024mtx_lock(&rb_pipe->call_mutex);1025pipe->create_fence_fd(pipe, fence, fd, type);1026mtx_unlock(&rb_pipe->call_mutex);1027}10281029static void1030rbug_fence_server_sync(struct pipe_context *_pipe,1031struct pipe_fence_handle *fence)1032{1033struct rbug_context *rb_pipe = rbug_context(_pipe);1034struct pipe_context *pipe = rb_pipe->pipe;10351036mtx_lock(&rb_pipe->call_mutex);1037pipe->fence_server_sync(pipe, fence);1038mtx_unlock(&rb_pipe->call_mutex);1039}10401041static struct pipe_sampler_view *1042rbug_context_create_sampler_view(struct pipe_context *_pipe,1043struct pipe_resource *_resource,1044const struct pipe_sampler_view *templ)1045{1046struct rbug_context *rb_pipe = rbug_context(_pipe);1047struct rbug_resource *rb_resource = rbug_resource(_resource);1048struct pipe_context *pipe = rb_pipe->pipe;1049struct pipe_resource *resource = rb_resource->resource;1050struct pipe_sampler_view *result;10511052mtx_lock(&rb_pipe->call_mutex);1053result = pipe->create_sampler_view(pipe,1054resource,1055templ);1056mtx_unlock(&rb_pipe->call_mutex);10571058if (result)1059return rbug_sampler_view_create(rb_pipe, rb_resource, result);1060return NULL;1061}10621063static void1064rbug_context_sampler_view_destroy(struct pipe_context *_pipe,1065struct pipe_sampler_view *_view)1066{1067rbug_sampler_view_destroy(rbug_context(_pipe),1068rbug_sampler_view(_view));1069}10701071static struct pipe_surface *1072rbug_context_create_surface(struct pipe_context *_pipe,1073struct pipe_resource *_resource,1074const struct pipe_surface *surf_tmpl)1075{1076struct rbug_context *rb_pipe = rbug_context(_pipe);1077struct rbug_resource *rb_resource = rbug_resource(_resource);1078struct pipe_context *pipe = rb_pipe->pipe;1079struct pipe_resource *resource = rb_resource->resource;1080struct pipe_surface *result;10811082mtx_lock(&rb_pipe->call_mutex);1083result = pipe->create_surface(pipe,1084resource,1085surf_tmpl);1086mtx_unlock(&rb_pipe->call_mutex);10871088if (result)1089return rbug_surface_create(rb_pipe, rb_resource, result);1090return NULL;1091}10921093static void1094rbug_context_surface_destroy(struct pipe_context *_pipe,1095struct pipe_surface *_surface)1096{1097struct rbug_context *rb_pipe = rbug_context(_pipe);1098struct rbug_surface *rb_surface = rbug_surface(_surface);10991100mtx_lock(&rb_pipe->call_mutex);1101rbug_surface_destroy(rb_pipe,1102rb_surface);1103mtx_unlock(&rb_pipe->call_mutex);1104}1105110611071108static void *1109rbug_context_buffer_map(struct pipe_context *_context,1110struct pipe_resource *_resource,1111unsigned level,1112unsigned usage,1113const struct pipe_box *box,1114struct pipe_transfer **transfer)1115{1116struct rbug_context *rb_pipe = rbug_context(_context);1117struct rbug_resource *rb_resource = rbug_resource(_resource);1118struct pipe_context *context = rb_pipe->pipe;1119struct pipe_resource *resource = rb_resource->resource;1120struct pipe_transfer *result;1121void *map;11221123mtx_lock(&rb_pipe->call_mutex);1124map = context->buffer_map(context,1125resource,1126level,1127usage,1128box, &result);1129mtx_unlock(&rb_pipe->call_mutex);11301131*transfer = rbug_transfer_create(rb_pipe, rb_resource, result);1132return *transfer ? map : NULL;1133}11341135static void *1136rbug_context_texture_map(struct pipe_context *_context,1137struct pipe_resource *_resource,1138unsigned level,1139unsigned usage,1140const struct pipe_box *box,1141struct pipe_transfer **transfer)1142{1143struct rbug_context *rb_pipe = rbug_context(_context);1144struct rbug_resource *rb_resource = rbug_resource(_resource);1145struct pipe_context *context = rb_pipe->pipe;1146struct pipe_resource *resource = rb_resource->resource;1147struct pipe_transfer *result;1148void *map;11491150mtx_lock(&rb_pipe->call_mutex);1151map = context->texture_map(context,1152resource,1153level,1154usage,1155box, &result);1156mtx_unlock(&rb_pipe->call_mutex);11571158*transfer = rbug_transfer_create(rb_pipe, rb_resource, result);1159return *transfer ? map : NULL;1160}11611162static void1163rbug_context_transfer_flush_region(struct pipe_context *_context,1164struct pipe_transfer *_transfer,1165const struct pipe_box *box)1166{1167struct rbug_context *rb_pipe = rbug_context(_context);1168struct rbug_transfer *rb_transfer = rbug_transfer(_transfer);1169struct pipe_context *context = rb_pipe->pipe;1170struct pipe_transfer *transfer = rb_transfer->transfer;11711172mtx_lock(&rb_pipe->call_mutex);1173context->transfer_flush_region(context,1174transfer,1175box);1176mtx_unlock(&rb_pipe->call_mutex);1177}117811791180static void1181rbug_context_buffer_unmap(struct pipe_context *_context,1182struct pipe_transfer *_transfer)1183{1184struct rbug_context *rb_pipe = rbug_context(_context);1185struct rbug_transfer *rb_transfer = rbug_transfer(_transfer);1186struct pipe_context *context = rb_pipe->pipe;1187struct pipe_transfer *transfer = rb_transfer->transfer;11881189mtx_lock(&rb_pipe->call_mutex);1190context->buffer_unmap(context,1191transfer);1192rbug_transfer_destroy(rb_pipe,1193rb_transfer);1194mtx_unlock(&rb_pipe->call_mutex);1195}11961197static void1198rbug_context_texture_unmap(struct pipe_context *_context,1199struct pipe_transfer *_transfer)1200{1201struct rbug_context *rb_pipe = rbug_context(_context);1202struct rbug_transfer *rb_transfer = rbug_transfer(_transfer);1203struct pipe_context *context = rb_pipe->pipe;1204struct pipe_transfer *transfer = rb_transfer->transfer;12051206mtx_lock(&rb_pipe->call_mutex);1207context->texture_unmap(context,1208transfer);1209rbug_transfer_destroy(rb_pipe,1210rb_transfer);1211mtx_unlock(&rb_pipe->call_mutex);1212}121312141215static void1216rbug_context_buffer_subdata(struct pipe_context *_context,1217struct pipe_resource *_resource,1218unsigned usage, unsigned offset,1219unsigned size, const void *data)1220{1221struct rbug_context *rb_pipe = rbug_context(_context);1222struct rbug_resource *rb_resource = rbug_resource(_resource);1223struct pipe_context *context = rb_pipe->pipe;1224struct pipe_resource *resource = rb_resource->resource;12251226mtx_lock(&rb_pipe->call_mutex);1227context->buffer_subdata(context, resource, usage, offset, size, data);1228mtx_unlock(&rb_pipe->call_mutex);1229}123012311232static void1233rbug_context_texture_subdata(struct pipe_context *_context,1234struct pipe_resource *_resource,1235unsigned level,1236unsigned usage,1237const struct pipe_box *box,1238const void *data,1239unsigned stride,1240unsigned layer_stride)1241{1242struct rbug_context *rb_pipe = rbug_context(_context);1243struct rbug_resource *rb_resource = rbug_resource(_resource);1244struct pipe_context *context = rb_pipe->pipe;1245struct pipe_resource *resource = rb_resource->resource;12461247mtx_lock(&rb_pipe->call_mutex);1248context->texture_subdata(context,1249resource,1250level,1251usage,1252box,1253data,1254stride,1255layer_stride);1256mtx_unlock(&rb_pipe->call_mutex);1257}12581259static void1260rbug_context_texture_barrier(struct pipe_context *_context, unsigned flags)1261{1262struct rbug_context *rb_pipe = rbug_context(_context);1263struct pipe_context *context = rb_pipe->pipe;12641265mtx_lock(&rb_pipe->call_mutex);1266context->texture_barrier(context,1267flags);1268mtx_unlock(&rb_pipe->call_mutex);1269}12701271struct pipe_context *1272rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)1273{1274struct rbug_context *rb_pipe;1275struct rbug_screen *rb_screen = rbug_screen(_screen);12761277if (!rb_screen)1278return NULL;12791280rb_pipe = CALLOC_STRUCT(rbug_context);1281if (!rb_pipe)1282return NULL;12831284(void) mtx_init(&rb_pipe->draw_mutex, mtx_plain);1285cnd_init(&rb_pipe->draw_cond);1286(void) mtx_init(&rb_pipe->call_mutex, mtx_plain);1287(void) mtx_init(&rb_pipe->list_mutex, mtx_plain);1288make_empty_list(&rb_pipe->shaders);12891290rb_pipe->base.screen = _screen;1291rb_pipe->base.priv = pipe->priv; /* expose wrapped data */1292rb_pipe->base.draw = NULL;1293rb_pipe->base.stream_uploader = pipe->stream_uploader;1294rb_pipe->base.const_uploader = pipe->const_uploader;12951296rb_pipe->base.destroy = rbug_destroy;1297rb_pipe->base.draw_vbo = rbug_draw_vbo;1298rb_pipe->base.create_query = rbug_create_query;1299rb_pipe->base.destroy_query = rbug_destroy_query;1300rb_pipe->base.begin_query = rbug_begin_query;1301rb_pipe->base.end_query = rbug_end_query;1302rb_pipe->base.get_query_result = rbug_get_query_result;1303rb_pipe->base.set_active_query_state = rbug_set_active_query_state;1304rb_pipe->base.create_blend_state = rbug_create_blend_state;1305rb_pipe->base.bind_blend_state = rbug_bind_blend_state;1306rb_pipe->base.delete_blend_state = rbug_delete_blend_state;1307rb_pipe->base.create_sampler_state = rbug_create_sampler_state;1308rb_pipe->base.bind_sampler_states = rbug_bind_sampler_states;1309rb_pipe->base.delete_sampler_state = rbug_delete_sampler_state;1310rb_pipe->base.create_rasterizer_state = rbug_create_rasterizer_state;1311rb_pipe->base.bind_rasterizer_state = rbug_bind_rasterizer_state;1312rb_pipe->base.delete_rasterizer_state = rbug_delete_rasterizer_state;1313rb_pipe->base.create_depth_stencil_alpha_state = rbug_create_depth_stencil_alpha_state;1314rb_pipe->base.bind_depth_stencil_alpha_state = rbug_bind_depth_stencil_alpha_state;1315rb_pipe->base.delete_depth_stencil_alpha_state = rbug_delete_depth_stencil_alpha_state;1316rb_pipe->base.create_fs_state = rbug_create_fs_state;1317rb_pipe->base.bind_fs_state = rbug_bind_fs_state;1318rb_pipe->base.delete_fs_state = rbug_delete_fs_state;1319rb_pipe->base.create_vs_state = rbug_create_vs_state;1320rb_pipe->base.bind_vs_state = rbug_bind_vs_state;1321rb_pipe->base.delete_vs_state = rbug_delete_vs_state;1322rb_pipe->base.create_gs_state = rbug_create_gs_state;1323rb_pipe->base.bind_gs_state = rbug_bind_gs_state;1324rb_pipe->base.delete_gs_state = rbug_delete_gs_state;1325rb_pipe->base.create_vertex_elements_state = rbug_create_vertex_elements_state;1326rb_pipe->base.bind_vertex_elements_state = rbug_bind_vertex_elements_state;1327rb_pipe->base.delete_vertex_elements_state = rbug_delete_vertex_elements_state;1328rb_pipe->base.set_blend_color = rbug_set_blend_color;1329rb_pipe->base.set_stencil_ref = rbug_set_stencil_ref;1330rb_pipe->base.set_clip_state = rbug_set_clip_state;1331rb_pipe->base.set_constant_buffer = rbug_set_constant_buffer;1332rb_pipe->base.set_framebuffer_state = rbug_set_framebuffer_state;1333rb_pipe->base.set_polygon_stipple = rbug_set_polygon_stipple;1334rb_pipe->base.set_scissor_states = rbug_set_scissor_states;1335rb_pipe->base.set_viewport_states = rbug_set_viewport_states;1336rb_pipe->base.set_sampler_views = rbug_set_sampler_views;1337rb_pipe->base.set_vertex_buffers = rbug_set_vertex_buffers;1338rb_pipe->base.set_sample_mask = rbug_set_sample_mask;1339rb_pipe->base.create_stream_output_target = rbug_create_stream_output_target;1340rb_pipe->base.stream_output_target_destroy = rbug_stream_output_target_destroy;1341rb_pipe->base.set_stream_output_targets = rbug_set_stream_output_targets;1342rb_pipe->base.resource_copy_region = rbug_resource_copy_region;1343rb_pipe->base.blit = rbug_blit;1344rb_pipe->base.clear = rbug_clear;1345rb_pipe->base.clear_render_target = rbug_clear_render_target;1346rb_pipe->base.clear_depth_stencil = rbug_clear_depth_stencil;1347rb_pipe->base.flush = rbug_flush;1348rb_pipe->base.create_fence_fd = rbug_create_fence_fd;1349rb_pipe->base.fence_server_sync = rbug_fence_server_sync;1350rb_pipe->base.create_sampler_view = rbug_context_create_sampler_view;1351rb_pipe->base.sampler_view_destroy = rbug_context_sampler_view_destroy;1352rb_pipe->base.create_surface = rbug_context_create_surface;1353rb_pipe->base.surface_destroy = rbug_context_surface_destroy;1354rb_pipe->base.buffer_map = rbug_context_buffer_map;1355rb_pipe->base.buffer_unmap = rbug_context_buffer_unmap;1356rb_pipe->base.texture_map = rbug_context_texture_map;1357rb_pipe->base.texture_unmap = rbug_context_texture_unmap;1358rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region;1359rb_pipe->base.buffer_subdata = rbug_context_buffer_subdata;1360rb_pipe->base.texture_subdata = rbug_context_texture_subdata;1361rb_pipe->base.texture_barrier = rbug_context_texture_barrier;1362rb_pipe->base.flush_resource = rbug_flush_resource;13631364rb_pipe->pipe = pipe;13651366rbug_screen_add_to_list(rb_screen, contexts, rb_pipe);13671368if (debug_get_bool_option("GALLIUM_RBUG_START_BLOCKED", false)) {1369rb_pipe->draw_blocked = RBUG_BLOCK_BEFORE;1370}13711372return &rb_pipe->base;1373}137413751376