X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fgalahad%2Fglhd_context.c;h=79d549585b7e3cfe95a0bf28d841dec13e640593;hb=8928788d585c92e980237e89a2fac30ad656d5e9;hp=92ca4a63da911d88a1ed385cdb7578311520f114;hpb=369e46888904c6d379b8b477d9242cff1608e30e;p=mesa.git diff --git a/src/gallium/drivers/galahad/glhd_context.c b/src/gallium/drivers/galahad/glhd_context.c index 92ca4a63da9..79d549585b7 100644 --- a/src/gallium/drivers/galahad/glhd_context.c +++ b/src/gallium/drivers/galahad/glhd_context.c @@ -63,7 +63,8 @@ galahad_context_draw_vbo(struct pipe_context *_pipe, static struct pipe_query * galahad_context_create_query(struct pipe_context *_pipe, - unsigned query_type) + unsigned query_type, + unsigned index) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; @@ -74,12 +75,13 @@ galahad_context_create_query(struct pipe_context *_pipe, } if (query_type == PIPE_QUERY_TIME_ELAPSED && - !pipe->screen->get_param(pipe->screen, PIPE_CAP_TIMER_QUERY)) { + !pipe->screen->get_param(pipe->screen, PIPE_CAP_QUERY_TIME_ELAPSED)) { glhd_error("Timer query requested but not supported"); } return pipe->create_query(pipe, - query_type); + query_type, + index); } static void @@ -197,37 +199,9 @@ galahad_context_bind_sampler_states(struct pipe_context *_pipe, num_samplers, PIPE_MAX_SAMPLERS); } - switch (shader) { - case PIPE_SHADER_VERTEX: - pipe->bind_vertex_sampler_states(pipe, num_samplers, samplers); - break; - case PIPE_SHADER_FRAGMENT: - pipe->bind_fragment_sampler_states(pipe, num_samplers, samplers); - break; - default: - assert(0); - } -} - -static void -galahad_context_bind_vertex_sampler_states(struct pipe_context *_pipe, - unsigned num_samplers, - void **samplers) -{ - galahad_context_bind_sampler_states(_pipe, PIPE_SHADER_VERTEX, - 0, num_samplers, samplers); -} - -static void -galahad_context_bind_fragment_sampler_states(struct pipe_context *_pipe, - unsigned num_samplers, - void **samplers) -{ - galahad_context_bind_sampler_states(_pipe, PIPE_SHADER_FRAGMENT, - 0, num_samplers, samplers); + pipe->bind_sampler_states(pipe, shader, start, num_samplers, samplers); } - static void galahad_context_delete_sampler_state(struct pipe_context *_pipe, void *sampler) @@ -315,72 +289,39 @@ galahad_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe, depth_stencil_alpha); } -static void * -galahad_context_create_fs_state(struct pipe_context *_pipe, - const struct pipe_shader_state *fs) -{ - struct galahad_context *glhd_pipe = galahad_context(_pipe); - struct pipe_context *pipe = glhd_pipe->pipe; - - return pipe->create_fs_state(pipe, - fs); -} - -static void -galahad_context_bind_fs_state(struct pipe_context *_pipe, - void *fs) -{ - struct galahad_context *glhd_pipe = galahad_context(_pipe); - struct pipe_context *pipe = glhd_pipe->pipe; - - pipe->bind_fs_state(pipe, - fs); -} - -static void -galahad_context_delete_fs_state(struct pipe_context *_pipe, - void *fs) -{ - struct galahad_context *glhd_pipe = galahad_context(_pipe); - struct pipe_context *pipe = glhd_pipe->pipe; - - pipe->delete_fs_state(pipe, - fs); -} - -static void * -galahad_context_create_vs_state(struct pipe_context *_pipe, - const struct pipe_shader_state *vs) -{ - struct galahad_context *glhd_pipe = galahad_context(_pipe); - struct pipe_context *pipe = glhd_pipe->pipe; - - return pipe->create_vs_state(pipe, - vs); -} - -static void -galahad_context_bind_vs_state(struct pipe_context *_pipe, - void *vs) -{ - struct galahad_context *glhd_pipe = galahad_context(_pipe); - struct pipe_context *pipe = glhd_pipe->pipe; - - pipe->bind_vs_state(pipe, - vs); -} - -static void -galahad_context_delete_vs_state(struct pipe_context *_pipe, - void *vs) -{ - struct galahad_context *glhd_pipe = galahad_context(_pipe); - struct pipe_context *pipe = glhd_pipe->pipe; +#define GLHD_SHADER_STATE(shader_type) \ + static void * \ + galahad_context_create_##shader_type##_state(struct pipe_context *_pipe, \ + const struct pipe_shader_state *state) \ + { \ + struct galahad_context *glhd_pipe = galahad_context(_pipe); \ + struct pipe_context *pipe = glhd_pipe->pipe; \ + return pipe->create_##shader_type##_state(pipe, state); \ + } \ + \ + static void \ + galahad_context_bind_##shader_type##_state(struct pipe_context *_pipe, \ + void *state) \ + { \ + struct galahad_context *glhd_pipe = galahad_context(_pipe); \ + struct pipe_context *pipe = glhd_pipe->pipe; \ + pipe->bind_##shader_type##_state(pipe, state); \ + } \ + \ + static void \ + galahad_context_delete_##shader_type##_state(struct pipe_context *_pipe, \ + void *state) \ + { \ + struct galahad_context *glhd_pipe = galahad_context(_pipe); \ + struct pipe_context *pipe = glhd_pipe->pipe; \ + pipe->delete_##shader_type##_state(pipe, state); \ + } - pipe->delete_vs_state(pipe, - vs); -} +GLHD_SHADER_STATE(fs) +GLHD_SHADER_STATE(vs) +GLHD_SHADER_STATE(gs) +#undef GLHD_SHADER_STATE static void * galahad_context_create_vertex_elements_state(struct pipe_context *_pipe, @@ -545,25 +486,29 @@ galahad_context_set_polygon_stipple(struct pipe_context *_pipe, } static void -galahad_context_set_scissor_state(struct pipe_context *_pipe, +galahad_context_set_scissor_states(struct pipe_context *_pipe, + unsigned start_slot, + unsigned num_scissors, const struct pipe_scissor_state *scissor) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; - pipe->set_scissor_state(pipe, - scissor); + pipe->set_scissor_states(pipe, start_slot, num_scissors, + scissor); } static void -galahad_context_set_viewport_state(struct pipe_context *_pipe, +galahad_context_set_viewport_states(struct pipe_context *_pipe, + unsigned start_slot, + unsigned num_viewports, const struct pipe_viewport_state *viewport) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; - pipe->set_viewport_state(pipe, - viewport); + pipe->set_viewport_states(pipe, start_slot, num_viewports, + viewport); } static void @@ -575,53 +520,18 @@ galahad_context_set_sampler_views(struct pipe_context *_pipe, { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; - struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS]; - struct pipe_sampler_view **views = NULL; + struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SHADER_SAMPLER_VIEWS]; unsigned i; - if (_views) { - for (i = 0; i < num; i++) - unwrapped_views[i] = galahad_sampler_view_unwrap(_views[i]); - for (; i < PIPE_MAX_SAMPLERS; i++) - unwrapped_views[i] = NULL; - - views = unwrapped_views; - } - - switch (shader) { - case PIPE_SHADER_VERTEX: - pipe->set_vertex_sampler_views(pipe, num, views); - break; - case PIPE_SHADER_FRAGMENT: - pipe->set_fragment_sampler_views(pipe, num, views); - break; - default: - assert(0); - } -} - -static void -galahad_context_set_vertex_sampler_views(struct pipe_context *_pipe, - unsigned num, - struct pipe_sampler_view **_views) -{ - galahad_context_set_sampler_views(_pipe, PIPE_SHADER_VERTEX, - 0, num, _views); -} + for (i = 0; i < num; i++) + unwrapped_views[i] = galahad_sampler_view_unwrap(_views[i]); -static void -galahad_context_set_fragment_sampler_views(struct pipe_context *_pipe, - unsigned num, - struct pipe_sampler_view **_views) -{ - galahad_context_set_sampler_views(_pipe, PIPE_SHADER_FRAGMENT, - 0, num, _views); + pipe->set_sampler_views(pipe, shader, start, num, unwrapped_views); } - static void galahad_context_set_vertex_buffers(struct pipe_context *_pipe, - unsigned num_buffers, + unsigned start_slot, unsigned num_buffers, const struct pipe_vertex_buffer *_buffers) { struct galahad_context *glhd_pipe = galahad_context(_pipe); @@ -630,7 +540,7 @@ galahad_context_set_vertex_buffers(struct pipe_context *_pipe, struct pipe_vertex_buffer *buffers = NULL; unsigned i; - 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 = galahad_resource_unwrap(_buffers[i].buffer); @@ -638,7 +548,7 @@ galahad_context_set_vertex_buffers(struct pipe_context *_pipe, } pipe->set_vertex_buffers(pipe, - num_buffers, + start_slot, num_buffers, buffers); } @@ -675,16 +585,54 @@ galahad_context_set_index_buffer(struct pipe_context *_pipe, pipe->set_index_buffer(pipe, ib); } +static INLINE struct pipe_stream_output_target * +galahad_context_create_stream_output_target(struct pipe_context *_pipe, + struct pipe_resource *_res, + unsigned buffer_offset, + unsigned buffer_size) +{ + struct galahad_context *glhd_pipe = galahad_context(_pipe); + struct galahad_resource *glhd_resource_res = galahad_resource(_res); + struct pipe_context *pipe = glhd_pipe->pipe; + struct pipe_resource *res = glhd_resource_res->resource; + + return pipe->create_stream_output_target(pipe, + res, buffer_offset, buffer_size); +} + +static INLINE void +galahad_context_stream_output_target_destroy( + struct pipe_context *_pipe, + struct pipe_stream_output_target *target) +{ + struct galahad_context *glhd_pipe = galahad_context(_pipe); + struct pipe_context *pipe = glhd_pipe->pipe; + + pipe->stream_output_target_destroy(pipe, target); +} + +static INLINE void +galahad_context_set_stream_output_targets(struct pipe_context *_pipe, + unsigned num_targets, + struct pipe_stream_output_target **tgs, + const unsigned *offsets) +{ + struct galahad_context *glhd_pipe = galahad_context(_pipe); + struct pipe_context *pipe = glhd_pipe->pipe; + + pipe->set_stream_output_targets(pipe, num_targets, tgs, offsets); +} + static void galahad_context_resource_copy_region(struct pipe_context *_pipe, - struct pipe_resource *_dst, - unsigned dst_level, - unsigned dstx, - unsigned dsty, - unsigned dstz, - struct pipe_resource *_src, - unsigned src_level, - const struct pipe_box *src_box) + struct pipe_resource *_dst, + unsigned dst_level, + unsigned dstx, + unsigned dsty, + unsigned dstz, + struct pipe_resource *_src, + unsigned src_level, + const struct pipe_box *src_box) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct galahad_resource *glhd_resource_dst = galahad_resource(_dst); @@ -723,27 +671,43 @@ galahad_context_resource_copy_region(struct pipe_context *_pipe, static void galahad_context_blit(struct pipe_context *_pipe, - const struct pipe_blit_info *info) + const struct pipe_blit_info *_info) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; + struct pipe_blit_info info = *_info; - if (info->dst.box.width < 0 || - info->dst.box.height < 0) + info.dst.resource = galahad_resource_unwrap(info.dst.resource); + info.src.resource = galahad_resource_unwrap(info.src.resource); + + if (info.dst.box.width < 0 || + info.dst.box.height < 0) glhd_error("Destination dimensions are negative"); - if (info->filter != PIPE_TEX_FILTER_NEAREST && - info->src.resource->target != PIPE_TEXTURE_3D && - info->dst.box.depth != info->src.box.depth) + if (info.filter != PIPE_TEX_FILTER_NEAREST && + info.src.resource->target != PIPE_TEXTURE_3D && + info.dst.box.depth != info.src.box.depth) glhd_error("Filtering in z-direction on non-3D texture"); - if (util_format_is_depth_or_stencil(info->dst.format) != - util_format_is_depth_or_stencil(info->src.format)) + if (util_format_is_depth_or_stencil(info.dst.format) != + util_format_is_depth_or_stencil(info.src.format)) glhd_error("Invalid format conversion: %s <- %s\n", - util_format_name(info->dst.format), - util_format_name(info->src.format)); + util_format_name(info.dst.format), + util_format_name(info.src.format)); + + pipe->blit(pipe, &info); +} + +static void +galahad_context_flush_resource(struct pipe_context *_pipe, + struct pipe_resource *_res) +{ + struct galahad_context *glhd_pipe = galahad_context(_pipe); + struct galahad_resource *glhd_resource_res = galahad_resource(_res); + struct pipe_context *pipe = glhd_pipe->pipe; + struct pipe_resource *res = glhd_resource_res->resource; - pipe->blit(pipe, info); + pipe->flush_resource(pipe, res); } static void @@ -811,13 +775,13 @@ galahad_context_clear_depth_stencil(struct pipe_context *_pipe, static void galahad_context_flush(struct pipe_context *_pipe, - struct pipe_fence_handle **fence) + struct pipe_fence_handle **fence, + unsigned flags) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; - pipe->flush(pipe, - fence); + pipe->flush(pipe, fence, flags); } static struct pipe_sampler_view * @@ -975,12 +939,13 @@ galahad_context_transfer_inline_write(struct pipe_context *_context, static void galahad_context_render_condition(struct pipe_context *_context, struct pipe_query *query, + boolean condition, uint mode) { struct galahad_context *glhd_context = galahad_context(_context); struct pipe_context *context = glhd_context->pipe; - context->render_condition(context, query, mode); + context->render_condition(context, query, condition, mode); } @@ -1015,10 +980,7 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) GLHD_PIPE_INIT(bind_blend_state); GLHD_PIPE_INIT(delete_blend_state); GLHD_PIPE_INIT(create_sampler_state); - GLHD_PIPE_INIT(bind_fragment_sampler_states); - GLHD_PIPE_INIT(bind_vertex_sampler_states); - //GLHD_PIPE_INIT(bind_geometry_sampler_states); - //GLHD_PIPE_INIT(bind_compute_sampler_states); + GLHD_PIPE_INIT(bind_sampler_states); GLHD_PIPE_INIT(delete_sampler_state); GLHD_PIPE_INIT(create_rasterizer_state); GLHD_PIPE_INIT(bind_rasterizer_state); @@ -1032,9 +994,9 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) GLHD_PIPE_INIT(create_vs_state); GLHD_PIPE_INIT(bind_vs_state); GLHD_PIPE_INIT(delete_vs_state); - //GLHD_PIPE_INIT(create_gs_state); - //GLHD_PIPE_INIT(bind_gs_state); - //GLHD_PIPE_INIT(delete_gs_state); + GLHD_PIPE_INIT(create_gs_state); + GLHD_PIPE_INIT(bind_gs_state); + GLHD_PIPE_INIT(delete_gs_state); GLHD_PIPE_INIT(create_vertex_elements_state); GLHD_PIPE_INIT(bind_vertex_elements_state); GLHD_PIPE_INIT(delete_vertex_elements_state); @@ -1045,20 +1007,18 @@ galahad_context_create(struct pipe_screen *_screen, struct pipe_context *pipe) GLHD_PIPE_INIT(set_constant_buffer); GLHD_PIPE_INIT(set_framebuffer_state); GLHD_PIPE_INIT(set_polygon_stipple); - GLHD_PIPE_INIT(set_scissor_state); - GLHD_PIPE_INIT(set_viewport_state); - GLHD_PIPE_INIT(set_fragment_sampler_views); - GLHD_PIPE_INIT(set_vertex_sampler_views); - //GLHD_PIPE_INIT(set_geometry_sampler_views); - //GLHD_PIPE_INIT(set_compute_sampler_views); + GLHD_PIPE_INIT(set_scissor_states); + GLHD_PIPE_INIT(set_viewport_states); + GLHD_PIPE_INIT(set_sampler_views); //GLHD_PIPE_INIT(set_shader_resources); GLHD_PIPE_INIT(set_vertex_buffers); GLHD_PIPE_INIT(set_index_buffer); - //GLHD_PIPE_INIT(create_stream_output_target); - //GLHD_PIPE_INIT(stream_output_target_destroy); - //GLHD_PIPE_INIT(set_stream_output_targets); + GLHD_PIPE_INIT(create_stream_output_target); + GLHD_PIPE_INIT(stream_output_target_destroy); + GLHD_PIPE_INIT(set_stream_output_targets); GLHD_PIPE_INIT(resource_copy_region); GLHD_PIPE_INIT(blit); + GLHD_PIPE_INIT(flush_resource); GLHD_PIPE_INIT(clear); GLHD_PIPE_INIT(clear_render_target); GLHD_PIPE_INIT(clear_depth_stencil);