aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/gallium/auxiliary/util/u_blitter.c
diff options
context:
space:
mode:
Diffstat (limited to 'mesalib/src/gallium/auxiliary/util/u_blitter.c')
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_blitter.c124
1 files changed, 28 insertions, 96 deletions
diff --git a/mesalib/src/gallium/auxiliary/util/u_blitter.c b/mesalib/src/gallium/auxiliary/util/u_blitter.c
index 8c871fdf9..e9ac170f7 100644
--- a/mesalib/src/gallium/auxiliary/util/u_blitter.c
+++ b/mesalib/src/gallium/auxiliary/util/u_blitter.c
@@ -67,9 +67,9 @@ struct blitter_context_priv
void *vs_pos_only; /**< Vertex shader which passes pos to the output.*/
/* Fragment shaders. */
- /* The shader at index i outputs color to color buffers 0,1,...,i-1. */
- void *fs_col[PIPE_MAX_COLOR_BUFS+1];
- void *fs_col_int[PIPE_MAX_COLOR_BUFS+1];
+ void *fs_empty;
+ void *fs_write_one_cbuf;
+ void *fs_write_all_cbufs;
/* FS which outputs a color from a texture,
where the index is PIPE_TEXTURE_* to be sampled. */
@@ -98,8 +98,6 @@ struct blitter_context_priv
/* Vertex elements states. */
void *velem_state;
- void *velem_uint_state;
- void *velem_sint_state;
void *velem_state_readbuf[4]; /**< X, XY, XYZ, XYZW */
/* Sampler state. */
@@ -119,7 +117,6 @@ struct blitter_context_priv
unsigned dst_height;
boolean has_geometry_shader;
- boolean vertex_has_integers;
boolean has_stream_out;
boolean has_stencil_export;
boolean has_texture_multisample;
@@ -171,9 +168,6 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
ctx->has_geometry_shader =
pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_GEOMETRY,
PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0;
- ctx->vertex_has_integers =
- pipe->screen->get_shader_param(pipe->screen, PIPE_SHADER_VERTEX,
- PIPE_SHADER_CAP_INTEGERS);
ctx->has_stream_out =
pipe->screen->get_param(pipe->screen,
PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0;
@@ -265,26 +259,6 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
}
ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
- if (ctx->vertex_has_integers) {
- memset(&velem[0], 0, sizeof(velem[0]) * 2);
- velem[0].src_offset = 0;
- velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
- velem[0].vertex_buffer_index = ctx->base.vb_slot;
- velem[1].src_offset = 4 * sizeof(float);
- velem[1].src_format = PIPE_FORMAT_R32G32B32A32_SINT;
- velem[1].vertex_buffer_index = ctx->base.vb_slot;
- ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
-
- memset(&velem[0], 0, sizeof(velem[0]) * 2);
- velem[0].src_offset = 0;
- velem[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
- velem[0].vertex_buffer_index = ctx->base.vb_slot;
- velem[1].src_offset = 4 * sizeof(float);
- velem[1].src_format = PIPE_FORMAT_R32G32B32A32_UINT;
- velem[1].vertex_buffer_index = ctx->base.vb_slot;
- ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
- }
-
if (ctx->has_stream_out) {
static enum pipe_format formats[4] = {
PIPE_FORMAT_R32_UINT,
@@ -301,7 +275,16 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
}
}
- /* fragment shaders are created on-demand */
+ /* Fragment shaders are created on-demand, except these.
+ * The interpolation must be constant for integer texture clearing to work.
+ */
+ ctx->fs_empty = util_make_empty_fragment_shader(pipe);
+ ctx->fs_write_one_cbuf =
+ util_make_fragment_passthrough_shader(pipe, TGSI_SEMANTIC_GENERIC,
+ TGSI_INTERPOLATE_CONSTANT, FALSE);
+ ctx->fs_write_all_cbufs =
+ util_make_fragment_passthrough_shader(pipe, TGSI_SEMANTIC_GENERIC,
+ TGSI_INTERPOLATE_CONSTANT, TRUE);
/* vertex shaders */
{
@@ -359,10 +342,6 @@ void util_blitter_destroy(struct blitter_context *blitter)
if (ctx->vs_pos_only)
pipe->delete_vs_state(pipe, ctx->vs_pos_only);
pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
- if (ctx->vertex_has_integers) {
- pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state);
- pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state);
- }
for (i = 0; i < 4; i++) {
if (ctx->velem_state_readbuf[i]) {
pipe->delete_vertex_elements_state(pipe, ctx->velem_state_readbuf[i]);
@@ -379,13 +358,9 @@ void util_blitter_destroy(struct blitter_context *blitter)
if (ctx->fs_texfetch_stencil[i])
ctx->delete_fs_state(pipe, ctx->fs_texfetch_stencil[i]);
}
-
- for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) {
- if (ctx->fs_col[i])
- ctx->delete_fs_state(pipe, ctx->fs_col[i]);
- if (ctx->fs_col_int[i])
- ctx->delete_fs_state(pipe, ctx->fs_col_int[i]);
- }
+ ctx->delete_fs_state(pipe, ctx->fs_empty);
+ ctx->delete_fs_state(pipe, ctx->fs_write_one_cbuf);
+ ctx->delete_fs_state(pipe, ctx->fs_write_all_cbufs);
pipe->delete_sampler_state(pipe, ctx->sampler_state_rect_linear);
pipe->delete_sampler_state(pipe, ctx->sampler_state_rect);
@@ -732,30 +707,6 @@ static void blitter_set_dst_dimensions(struct blitter_context_priv *ctx,
ctx->dst_height = height;
}
-static void *blitter_get_fs_col(struct blitter_context_priv *ctx,
- unsigned num_cbufs, boolean int_format)
-{
- struct pipe_context *pipe = ctx->base.pipe;
-
- assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
-
- if (int_format) {
- if (!ctx->fs_col_int[num_cbufs])
- ctx->fs_col_int[num_cbufs] =
- util_make_fragment_cloneinput_shader(pipe, num_cbufs,
- TGSI_SEMANTIC_GENERIC,
- TGSI_INTERPOLATE_CONSTANT);
- return ctx->fs_col_int[num_cbufs];
- } else {
- if (!ctx->fs_col[num_cbufs])
- ctx->fs_col[num_cbufs] =
- util_make_fragment_cloneinput_shader(pipe, num_cbufs,
- TGSI_SEMANTIC_GENERIC,
- TGSI_INTERPOLATE_LINEAR);
- return ctx->fs_col[num_cbufs];
- }
-}
-
static void *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
enum pipe_texture_target target,
unsigned nr_samples)
@@ -910,22 +861,15 @@ void util_blitter_cache_all_shaders(struct blitter_context *blitter)
{
struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
struct pipe_screen *screen = blitter->pipe->screen;
- unsigned num_cbufs, i, target, max_samples;
+ unsigned i, target, max_samples;
boolean has_arraytex, has_cubearraytex;
- num_cbufs = MAX2(screen->get_param(screen,
- PIPE_CAP_MAX_RENDER_TARGETS), 1);
max_samples = ctx->has_texture_multisample ? 2 : 1;
has_arraytex = screen->get_param(screen,
PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS) != 0;
has_cubearraytex = screen->get_param(screen,
PIPE_CAP_CUBE_MAP_ARRAY) != 0;
- for (i = 0; i < num_cbufs; i++) {
- blitter_get_fs_col(ctx, i, FALSE);
- blitter_get_fs_col(ctx, i, TRUE);
- }
-
/* It only matters if i <= 1 or > 1. */
for (i = 1; i <= max_samples; i++) {
for (target = PIPE_TEXTURE_1D; target < PIPE_MAX_TEXTURE_TYPES; target++) {
@@ -1007,9 +951,7 @@ void util_blitter_draw_rectangle(struct blitter_context *blitter,
static void util_blitter_clear_custom(struct blitter_context *blitter,
unsigned width, unsigned height,
- unsigned num_cbufs,
unsigned clear_buffers,
- enum pipe_format cbuf_format,
const union pipe_color_union *color,
double depth, unsigned stencil,
void *custom_blend, void *custom_dsa)
@@ -1017,8 +959,6 @@ static void util_blitter_clear_custom(struct blitter_context *blitter,
struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter;
struct pipe_context *pipe = ctx->base.pipe;
struct pipe_stencil_ref sr = { { 0 } };
- boolean int_format = util_format_is_pure_integer(cbuf_format);
- assert(num_cbufs <= PIPE_MAX_COLOR_BUFS);
blitter_set_running_flag(ctx);
blitter_check_saved_vertex_states(ctx);
@@ -1049,14 +989,8 @@ static void util_blitter_clear_custom(struct blitter_context *blitter,
sr.ref_value[0] = stencil & 0xff;
pipe->set_stencil_ref(pipe, &sr);
- if (util_format_is_pure_sint(cbuf_format)) {
- pipe->bind_vertex_elements_state(pipe, ctx->velem_sint_state);
- } else if (util_format_is_pure_uint(cbuf_format)) {
- pipe->bind_vertex_elements_state(pipe, ctx->velem_uint_state);
- } else {
- pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
- }
- ctx->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs, int_format));
+ pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
+ ctx->bind_fs_state(pipe, ctx->fs_write_all_cbufs);
pipe->set_sample_mask(pipe, ~0);
blitter_set_common_draw_rect_state(ctx, FALSE);
@@ -1072,14 +1006,12 @@ static void util_blitter_clear_custom(struct blitter_context *blitter,
void util_blitter_clear(struct blitter_context *blitter,
unsigned width, unsigned height,
- unsigned num_cbufs,
unsigned clear_buffers,
- enum pipe_format cbuf_format,
const union pipe_color_union *color,
double depth, unsigned stencil)
{
- util_blitter_clear_custom(blitter, width, height, num_cbufs,
- clear_buffers, cbuf_format, color, depth, stencil,
+ util_blitter_clear_custom(blitter, width, height,
+ clear_buffers, color, depth, stencil,
NULL, NULL);
}
@@ -1088,8 +1020,8 @@ void util_blitter_custom_clear_depth(struct blitter_context *blitter,
double depth, void *custom_dsa)
{
static const union pipe_color_union color;
- util_blitter_clear_custom(blitter, width, height, 0,
- 0, PIPE_FORMAT_NONE, &color, depth, 0, NULL, custom_dsa);
+ util_blitter_clear_custom(blitter, width, height, 0, &color, depth, 0,
+ NULL, custom_dsa);
}
void util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
@@ -1559,7 +1491,7 @@ void util_blitter_clear_render_target(struct blitter_context *blitter,
/* bind states */
pipe->bind_blend_state(pipe, ctx->blend[PIPE_MASK_RGBA]);
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
- ctx->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE));
+ ctx->bind_fs_state(pipe, ctx->fs_write_one_cbuf);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
/* set a framebuffer state */
@@ -1627,7 +1559,7 @@ void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
/* hmm that should be illegal probably, or make it a no-op somewhere */
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
- ctx->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE));
+ ctx->bind_fs_state(pipe, ctx->fs_empty);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
/* set a framebuffer state */
@@ -1678,7 +1610,7 @@ void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
pipe->bind_blend_state(pipe, cbsurf ? ctx->blend[PIPE_MASK_RGBA] :
ctx->blend[0]);
pipe->bind_depth_stencil_alpha_state(pipe, dsa_stage);
- ctx->bind_fs_state(pipe, blitter_get_fs_col(ctx, 0, FALSE));
+ ctx->bind_fs_state(pipe, ctx->fs_empty);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
/* set a framebuffer state */
@@ -1855,7 +1787,7 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter,
pipe->bind_blend_state(pipe, custom_blend);
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
- ctx->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE));
+ ctx->bind_fs_state(pipe, ctx->fs_write_one_cbuf);
pipe->set_sample_mask(pipe, sample_mask);
memset(&surf_tmpl, 0, sizeof(surf_tmpl));
@@ -1918,7 +1850,7 @@ void util_blitter_custom_color(struct blitter_context *blitter,
pipe->bind_blend_state(pipe, custom_blend ? custom_blend
: ctx->blend[PIPE_MASK_RGBA]);
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
- ctx->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1, FALSE));
+ ctx->bind_fs_state(pipe, ctx->fs_write_one_cbuf);
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
pipe->set_sample_mask(pipe, (1ull << MAX2(1, dstsurf->texture->nr_samples)) - 1);