X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Frbug%2Frbug_context.c;h=e1f3c4f28447aa768c553591770eac38fd4cb9be;hb=8147c4a4a58a9328a07fd358b54622de0d01c374;hp=62fe543b761c37f3eeab60a9a19c7af99ea1903d;hpb=43e4b3e311df3bede930229380a7aa389ac7019a;p=mesa.git diff --git a/src/gallium/drivers/rbug/rbug_context.c b/src/gallium/drivers/rbug/rbug_context.c index 62fe543b761..e1f3c4f2844 100644 --- a/src/gallium/drivers/rbug/rbug_context.c +++ b/src/gallium/drivers/rbug/rbug_context.c @@ -29,7 +29,7 @@ #include "pipe/p_context.h" #include "util/u_memory.h" #include "util/u_inlines.h" -#include "util/u_simple_list.h" +#include "util/simple_list.h" #include "rbug/rbug_context.h" @@ -40,14 +40,16 @@ static void rbug_destroy(struct pipe_context *_pipe) { + struct rbug_screen *rb_screen = rbug_screen(_pipe->screen); struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - remove_from_list(&rb_pipe->list); - pipe_mutex_lock(rb_pipe->call_mutex); + rbug_screen_remove_from_list(rb_screen, contexts, rb_pipe); + + mtx_lock(&rb_pipe->call_mutex); pipe->destroy(pipe); rb_pipe->pipe = NULL; - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); FREE(rb_pipe); } @@ -85,7 +87,7 @@ rbug_draw_block_locked(struct rbug_context *rb_pipe, int flag) if (rb_pipe->draw_rule.surf == rb_pipe->curr.cbufs[k]) block = TRUE; if (rb_pipe->draw_rule.texture) { - for (sh = 0; sh < Elements(rb_pipe->curr.num_views); sh++) { + for (sh = 0; sh < ARRAY_SIZE(rb_pipe->curr.num_views); sh++) { for (k = 0; k < rb_pipe->curr.num_views[sh]; k++) { if (rb_pipe->draw_rule.texture == rb_pipe->curr.texs[sh][k]) { block = TRUE; @@ -106,7 +108,7 @@ rbug_draw_block_locked(struct rbug_context *rb_pipe, int flag) /* wait for rbug to clear the blocked flag */ while (rb_pipe->draw_blocked & flag) { rb_pipe->draw_blocked |= flag; - pipe_condvar_wait(rb_pipe->draw_cond, rb_pipe->draw_mutex); + cnd_wait(&rb_pipe->draw_cond, &rb_pipe->draw_mutex); } } @@ -117,19 +119,19 @@ rbug_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info) struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->draw_mutex); + mtx_lock(&rb_pipe->draw_mutex); rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_BEFORE); - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); /* XXX loop over PIPE_SHADER_x here */ if (!(rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] && rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT]->disabled) && !(rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] && rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY]->disabled) && !(rb_pipe->curr.shader[PIPE_SHADER_VERTEX] && rb_pipe->curr.shader[PIPE_SHADER_VERTEX]->disabled)) pipe->draw_vbo(pipe, info); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); rbug_draw_block_locked(rb_pipe, RBUG_BLOCK_AFTER); - pipe_mutex_unlock(rb_pipe->draw_mutex); + mtx_unlock(&rb_pipe->draw_mutex); } static struct pipe_query * @@ -139,12 +141,14 @@ rbug_create_query(struct pipe_context *_pipe, { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - - pipe_mutex_lock(rb_pipe->call_mutex); - return pipe->create_query(pipe, - query_type, - index); - pipe_mutex_unlock(rb_pipe->call_mutex); + struct pipe_query *query; + + mtx_lock(&rb_pipe->call_mutex); + query = pipe->create_query(pipe, + query_type, + index); + mtx_unlock(&rb_pipe->call_mutex); + return query; } static void @@ -154,36 +158,40 @@ rbug_destroy_query(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->destroy_query(pipe, query); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } -static void +static boolean rbug_begin_query(struct pipe_context *_pipe, struct pipe_query *query) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; + boolean ret; - pipe_mutex_lock(rb_pipe->call_mutex); - pipe->begin_query(pipe, - query); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); + ret = pipe->begin_query(pipe, query); + mtx_unlock(&rb_pipe->call_mutex); + return ret; } -static void +static bool rbug_end_query(struct pipe_context *_pipe, struct pipe_query *query) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; + bool ret; + + mtx_lock(&rb_pipe->call_mutex); + ret = pipe->end_query(pipe, + query); + mtx_unlock(&rb_pipe->call_mutex); - pipe_mutex_lock(rb_pipe->call_mutex); - pipe->end_query(pipe, - query); - pipe_mutex_unlock(rb_pipe->call_mutex); + return ret; } static boolean @@ -196,16 +204,27 @@ rbug_get_query_result(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; boolean ret; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); ret = pipe->get_query_result(pipe, query, wait, result); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); return ret; } +static void +rbug_set_active_query_state(struct pipe_context *_pipe, boolean enable) +{ + struct rbug_context *rb_pipe = rbug_context(_pipe); + struct pipe_context *pipe = rb_pipe->pipe; + + mtx_lock(&rb_pipe->call_mutex); + pipe->set_active_query_state(pipe, enable); + mtx_unlock(&rb_pipe->call_mutex); +} + static void * rbug_create_blend_state(struct pipe_context *_pipe, const struct pipe_blend_state *blend) @@ -214,10 +233,10 @@ rbug_create_blend_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *ret; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); ret = pipe->create_blend_state(pipe, blend); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); return ret; } @@ -229,10 +248,10 @@ rbug_bind_blend_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->bind_blend_state(pipe, blend); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -242,10 +261,10 @@ rbug_delete_blend_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->delete_blend_state(pipe, blend); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -256,25 +275,26 @@ rbug_create_sampler_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *ret; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); ret = pipe->create_sampler_state(pipe, sampler); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); return ret; } static void -rbug_bind_sampler_states(struct pipe_context *_pipe, unsigned shader, +rbug_bind_sampler_states(struct pipe_context *_pipe, + enum pipe_shader_type shader, unsigned start, unsigned count, void **samplers) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->bind_sampler_states(pipe, shader, start, count, samplers); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -284,10 +304,10 @@ rbug_delete_sampler_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->delete_sampler_state(pipe, sampler); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -298,10 +318,10 @@ rbug_create_rasterizer_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *ret; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); ret = pipe->create_rasterizer_state(pipe, rasterizer); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); return ret; } @@ -313,10 +333,10 @@ rbug_bind_rasterizer_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->bind_rasterizer_state(pipe, rasterizer); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -326,10 +346,10 @@ rbug_delete_rasterizer_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->delete_rasterizer_state(pipe, rasterizer); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -340,10 +360,10 @@ rbug_create_depth_stencil_alpha_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *ret; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); ret = pipe->create_depth_stencil_alpha_state(pipe, depth_stencil_alpha); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); return ret; } @@ -355,10 +375,10 @@ rbug_bind_depth_stencil_alpha_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->bind_depth_stencil_alpha_state(pipe, depth_stencil_alpha); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -368,10 +388,10 @@ rbug_delete_depth_stencil_alpha_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->delete_depth_stencil_alpha_state(pipe, depth_stencil_alpha); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -382,9 +402,9 @@ rbug_create_fs_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *result; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); result = pipe->create_fs_state(pipe, state); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); if (!result) return NULL; @@ -400,14 +420,14 @@ rbug_bind_fs_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *fs; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); fs = rbug_shader_unwrap(_fs); rb_pipe->curr.shader[PIPE_SHADER_FRAGMENT] = rbug_shader(_fs); pipe->bind_fs_state(pipe, fs); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -417,9 +437,9 @@ rbug_delete_fs_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct rbug_shader *rb_shader = rbug_shader(_fs); - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); rbug_shader_destroy(rb_pipe, rb_shader); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -430,9 +450,9 @@ rbug_create_vs_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *result; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); result = pipe->create_vs_state(pipe, state); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); if (!result) return NULL; @@ -448,14 +468,14 @@ rbug_bind_vs_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *vs; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); vs = rbug_shader_unwrap(_vs); rb_pipe->curr.shader[PIPE_SHADER_VERTEX] = rbug_shader(_vs); pipe->bind_vs_state(pipe, vs); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -465,9 +485,9 @@ rbug_delete_vs_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct rbug_shader *rb_shader = rbug_shader(_vs); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); rbug_shader_destroy(rb_pipe, rb_shader); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -478,9 +498,9 @@ rbug_create_gs_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *result; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); result = pipe->create_gs_state(pipe, state); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); if (!result) return NULL; @@ -496,14 +516,14 @@ rbug_bind_gs_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *gs; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); gs = rbug_shader_unwrap(_gs); rb_pipe->curr.shader[PIPE_SHADER_GEOMETRY] = rbug_shader(_gs); pipe->bind_gs_state(pipe, gs); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -513,9 +533,9 @@ rbug_delete_gs_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct rbug_shader *rb_shader = rbug_shader(_gs); - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); rbug_shader_destroy(rb_pipe, rb_shader); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void * @@ -527,11 +547,11 @@ rbug_create_vertex_elements_state(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; void *ret; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); ret = pipe->create_vertex_elements_state(pipe, num_elements, vertex_elements); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); return ret; } @@ -543,10 +563,10 @@ rbug_bind_vertex_elements_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->bind_vertex_elements_state(pipe, velems); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -556,10 +576,10 @@ rbug_delete_vertex_elements_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->delete_vertex_elements_state(pipe, velems); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -569,10 +589,10 @@ rbug_set_blend_color(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_blend_color(pipe, blend_color); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -582,10 +602,10 @@ rbug_set_stencil_ref(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_stencil_ref(pipe, stencil_ref); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -595,17 +615,17 @@ rbug_set_clip_state(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_clip_state(pipe, clip); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void rbug_set_constant_buffer(struct pipe_context *_pipe, - uint shader, + enum pipe_shader_type shader, uint index, - struct pipe_constant_buffer *_cb) + const struct pipe_constant_buffer *_cb) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; @@ -617,12 +637,12 @@ rbug_set_constant_buffer(struct pipe_context *_pipe, cb.buffer = rbug_resource_unwrap(_cb->buffer); } - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_constant_buffer(pipe, shader, index, _cb ? &cb : NULL); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -636,7 +656,7 @@ rbug_set_framebuffer_state(struct pipe_context *_pipe, unsigned i; /* must protect curr status */ - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); rb_pipe->curr.nr_cbufs = 0; memset(rb_pipe->curr.cbufs, 0, sizeof(rb_pipe->curr.cbufs)); @@ -661,7 +681,7 @@ rbug_set_framebuffer_state(struct pipe_context *_pipe, pipe->set_framebuffer_state(pipe, state); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -671,10 +691,10 @@ rbug_set_polygon_stipple(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_polygon_stipple(pipe, poly_stipple); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -686,9 +706,9 @@ rbug_set_scissor_states(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_scissor_states(pipe, start_slot, num_scissors, scissor); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -700,14 +720,14 @@ rbug_set_viewport_states(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->set_viewport_states(pipe, start_slot, num_viewports, viewport); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void rbug_set_sampler_views(struct pipe_context *_pipe, - unsigned shader, + enum pipe_shader_type shader, unsigned start, unsigned num, struct pipe_sampler_view **_views) @@ -721,7 +741,7 @@ rbug_set_sampler_views(struct pipe_context *_pipe, assert(start == 0); /* XXX fix */ /* must protect curr status */ - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); rb_pipe->curr.num_views[shader] = 0; memset(rb_pipe->curr.views[shader], 0, sizeof(rb_pipe->curr.views[shader])); @@ -740,7 +760,7 @@ rbug_set_sampler_views(struct pipe_context *_pipe, pipe->set_sampler_views(pipe, shader, start, num, views); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -754,12 +774,15 @@ rbug_set_vertex_buffers(struct pipe_context *_pipe, struct pipe_vertex_buffer *buffers = NULL; unsigned i; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); - if (num_buffers) { + if (num_buffers && _buffers) { memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers)); - for (i = 0; i < num_buffers; i++) - unwrapped_buffers[i].buffer = rbug_resource_unwrap(_buffers[i].buffer); + for (i = 0; i < num_buffers; i++) { + if (!_buffers[i].is_user_buffer) + unwrapped_buffers[i].buffer.resource = + rbug_resource_unwrap(_buffers[i].buffer.resource); + } buffers = unwrapped_buffers; } @@ -767,38 +790,62 @@ rbug_set_vertex_buffers(struct pipe_context *_pipe, num_buffers, buffers); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void -rbug_set_index_buffer(struct pipe_context *_pipe, - const struct pipe_index_buffer *_ib) +rbug_set_sample_mask(struct pipe_context *_pipe, + unsigned sample_mask) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - struct pipe_index_buffer unwrapped_ib, *ib = NULL; - if (_ib) { - unwrapped_ib = *_ib; - unwrapped_ib.buffer = rbug_resource_unwrap(_ib->buffer); - ib = &unwrapped_ib; - } + mtx_lock(&rb_pipe->call_mutex); + pipe->set_sample_mask(pipe, sample_mask); + mtx_unlock(&rb_pipe->call_mutex); +} + +static struct pipe_stream_output_target * +rbug_create_stream_output_target(struct pipe_context *_pipe, + struct pipe_resource *_res, + unsigned buffer_offset, unsigned buffer_size) +{ + struct rbug_context *rb_pipe = rbug_context(_pipe); + struct pipe_context *pipe = rb_pipe->pipe; + struct pipe_resource *res = rbug_resource_unwrap(_res); + struct pipe_stream_output_target *target; + + mtx_lock(&rb_pipe->call_mutex); + target = pipe->create_stream_output_target(pipe, res, buffer_offset, + buffer_size); + mtx_unlock(&rb_pipe->call_mutex); + return target; +} + +static void +rbug_stream_output_target_destroy(struct pipe_context *_pipe, + struct pipe_stream_output_target *target) +{ + struct rbug_context *rb_pipe = rbug_context(_pipe); + struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); - pipe->set_index_buffer(pipe, ib); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); + pipe->stream_output_target_destroy(pipe, target); + mtx_unlock(&rb_pipe->call_mutex); } static void -rbug_set_sample_mask(struct pipe_context *_pipe, - unsigned sample_mask) +rbug_set_stream_output_targets(struct pipe_context *_pipe, + unsigned num_targets, + struct pipe_stream_output_target **targets, + const unsigned *offsets) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); - pipe->set_sample_mask(pipe, sample_mask); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); + pipe->set_stream_output_targets(pipe, num_targets, targets, offsets); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -819,7 +866,7 @@ rbug_resource_copy_region(struct pipe_context *_pipe, struct pipe_resource *dst = rb_resource_dst->resource; struct pipe_resource *src = rb_resource_src->resource; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->resource_copy_region(pipe, dst, dst_level, @@ -829,7 +876,7 @@ rbug_resource_copy_region(struct pipe_context *_pipe, src, src_level, src_box); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -847,9 +894,9 @@ rbug_blit(struct pipe_context *_pipe, const struct pipe_blit_info *_blit_info) blit_info.dst.resource = dst; blit_info.src.resource = src; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->blit(pipe, &blit_info); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -861,9 +908,9 @@ rbug_flush_resource(struct pipe_context *_pipe, struct pipe_context *pipe = rb_pipe->pipe; struct pipe_resource *res = rb_resource_res->resource; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->flush_resource(pipe, res); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -876,13 +923,13 @@ rbug_clear(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->clear(pipe, buffers, color, depth, stencil); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -890,22 +937,24 @@ rbug_clear_render_target(struct pipe_context *_pipe, struct pipe_surface *_dst, const union pipe_color_union *color, unsigned dstx, unsigned dsty, - unsigned width, unsigned height) + unsigned width, unsigned height, + bool render_condition_enabled) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct rbug_surface *rb_surface_dst = rbug_surface(_dst); struct pipe_context *pipe = rb_pipe->pipe; struct pipe_surface *dst = rb_surface_dst->surface; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->clear_render_target(pipe, dst, color, dstx, dsty, width, - height); - pipe_mutex_unlock(rb_pipe->call_mutex); + height, + render_condition_enabled); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -915,14 +964,15 @@ rbug_clear_depth_stencil(struct pipe_context *_pipe, double depth, unsigned stencil, unsigned dstx, unsigned dsty, - unsigned width, unsigned height) + unsigned width, unsigned height, + bool render_condition_enabled) { struct rbug_context *rb_pipe = rbug_context(_pipe); struct rbug_surface *rb_surface_dst = rbug_surface(_dst); struct pipe_context *pipe = rb_pipe->pipe; struct pipe_surface *dst = rb_surface_dst->surface; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->clear_depth_stencil(pipe, dst, clear_flags, @@ -931,8 +981,9 @@ rbug_clear_depth_stencil(struct pipe_context *_pipe, dstx, dsty, width, - height); - pipe_mutex_unlock(rb_pipe->call_mutex); + height, + render_condition_enabled); + mtx_unlock(&rb_pipe->call_mutex); } static void @@ -943,9 +994,9 @@ rbug_flush(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct pipe_context *pipe = rb_pipe->pipe; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); pipe->flush(pipe, fence, flags); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } static struct pipe_sampler_view * @@ -959,11 +1010,11 @@ rbug_context_create_sampler_view(struct pipe_context *_pipe, struct pipe_resource *resource = rb_resource->resource; struct pipe_sampler_view *result; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); result = pipe->create_sampler_view(pipe, resource, templ); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); if (result) return rbug_sampler_view_create(rb_pipe, rb_resource, result); @@ -989,11 +1040,11 @@ rbug_context_create_surface(struct pipe_context *_pipe, struct pipe_resource *resource = rb_resource->resource; struct pipe_surface *result; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); result = pipe->create_surface(pipe, resource, surf_tmpl); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); if (result) return rbug_surface_create(rb_pipe, rb_resource, result); @@ -1007,10 +1058,10 @@ rbug_context_surface_destroy(struct pipe_context *_pipe, struct rbug_context *rb_pipe = rbug_context(_pipe); struct rbug_surface *rb_surface = rbug_surface(_surface); - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); rbug_surface_destroy(rb_pipe, rb_surface); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } @@ -1030,13 +1081,13 @@ rbug_context_transfer_map(struct pipe_context *_context, struct pipe_transfer *result; void *map; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); map = context->transfer_map(context, resource, level, usage, box, &result); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); *transfer = rbug_transfer_create(rb_pipe, rb_resource, result); return *transfer ? map : NULL; @@ -1052,11 +1103,11 @@ rbug_context_transfer_flush_region(struct pipe_context *_context, struct pipe_context *context = rb_pipe->pipe; struct pipe_transfer *transfer = rb_transfer->transfer; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); context->transfer_flush_region(context, transfer, box); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); } @@ -1069,40 +1120,57 @@ rbug_context_transfer_unmap(struct pipe_context *_context, struct pipe_context *context = rb_pipe->pipe; struct pipe_transfer *transfer = rb_transfer->transfer; - pipe_mutex_lock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); context->transfer_unmap(context, transfer); rbug_transfer_destroy(rb_pipe, rb_transfer); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_unlock(&rb_pipe->call_mutex); +} + + +static void +rbug_context_buffer_subdata(struct pipe_context *_context, + struct pipe_resource *_resource, + unsigned usage, unsigned offset, + unsigned size, const void *data) +{ + struct rbug_context *rb_pipe = rbug_context(_context); + struct rbug_resource *rb_resource = rbug_resource(_resource); + struct pipe_context *context = rb_pipe->pipe; + struct pipe_resource *resource = rb_resource->resource; + + mtx_lock(&rb_pipe->call_mutex); + context->buffer_subdata(context, resource, usage, offset, size, data); + mtx_unlock(&rb_pipe->call_mutex); } static void -rbug_context_transfer_inline_write(struct pipe_context *_context, - struct pipe_resource *_resource, - unsigned level, - unsigned usage, - const struct pipe_box *box, - const void *data, - unsigned stride, - unsigned layer_stride) +rbug_context_texture_subdata(struct pipe_context *_context, + struct pipe_resource *_resource, + unsigned level, + unsigned usage, + const struct pipe_box *box, + const void *data, + unsigned stride, + unsigned layer_stride) { struct rbug_context *rb_pipe = rbug_context(_context); struct rbug_resource *rb_resource = rbug_resource(_resource); struct pipe_context *context = rb_pipe->pipe; struct pipe_resource *resource = rb_resource->resource; - pipe_mutex_lock(rb_pipe->call_mutex); - context->transfer_inline_write(context, - resource, - level, - usage, - box, - data, - stride, - layer_stride); - pipe_mutex_unlock(rb_pipe->call_mutex); + mtx_lock(&rb_pipe->call_mutex); + context->texture_subdata(context, + resource, + level, + usage, + box, + data, + stride, + layer_stride); + mtx_unlock(&rb_pipe->call_mutex); } @@ -1119,15 +1187,17 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) if (!rb_pipe) return NULL; - pipe_mutex_init(rb_pipe->draw_mutex); - pipe_condvar_init(rb_pipe->draw_cond); - pipe_mutex_init(rb_pipe->call_mutex); - pipe_mutex_init(rb_pipe->list_mutex); + (void) mtx_init(&rb_pipe->draw_mutex, mtx_plain); + cnd_init(&rb_pipe->draw_cond); + (void) mtx_init(&rb_pipe->call_mutex, mtx_plain); + (void) mtx_init(&rb_pipe->list_mutex, mtx_plain); make_empty_list(&rb_pipe->shaders); rb_pipe->base.screen = _screen; rb_pipe->base.priv = pipe->priv; /* expose wrapped data */ rb_pipe->base.draw = NULL; + rb_pipe->base.stream_uploader = pipe->stream_uploader; + rb_pipe->base.const_uploader = pipe->const_uploader; rb_pipe->base.destroy = rbug_destroy; rb_pipe->base.draw_vbo = rbug_draw_vbo; @@ -1136,6 +1206,7 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) rb_pipe->base.begin_query = rbug_begin_query; rb_pipe->base.end_query = rbug_end_query; rb_pipe->base.get_query_result = rbug_get_query_result; + rb_pipe->base.set_active_query_state = rbug_set_active_query_state; rb_pipe->base.create_blend_state = rbug_create_blend_state; rb_pipe->base.bind_blend_state = rbug_bind_blend_state; rb_pipe->base.delete_blend_state = rbug_delete_blend_state; @@ -1170,8 +1241,10 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) rb_pipe->base.set_viewport_states = rbug_set_viewport_states; rb_pipe->base.set_sampler_views = rbug_set_sampler_views; rb_pipe->base.set_vertex_buffers = rbug_set_vertex_buffers; - rb_pipe->base.set_index_buffer = rbug_set_index_buffer; rb_pipe->base.set_sample_mask = rbug_set_sample_mask; + rb_pipe->base.create_stream_output_target = rbug_create_stream_output_target; + rb_pipe->base.stream_output_target_destroy = rbug_stream_output_target_destroy; + rb_pipe->base.set_stream_output_targets = rbug_set_stream_output_targets; rb_pipe->base.resource_copy_region = rbug_resource_copy_region; rb_pipe->base.blit = rbug_blit; rb_pipe->base.flush_resource = rbug_flush_resource; @@ -1186,7 +1259,8 @@ rbug_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) rb_pipe->base.transfer_map = rbug_context_transfer_map; rb_pipe->base.transfer_unmap = rbug_context_transfer_unmap; rb_pipe->base.transfer_flush_region = rbug_context_transfer_flush_region; - rb_pipe->base.transfer_inline_write = rbug_context_transfer_inline_write; + rb_pipe->base.buffer_subdata = rbug_context_buffer_subdata; + rb_pipe->base.texture_subdata = rbug_context_texture_subdata; rb_pipe->pipe = pipe;