From 534868e150628ad64195d14cd3903124ebe19a50 Mon Sep 17 00:00:00 2001 From: Elie Tournier Date: Fri, 22 May 2020 11:02:46 +0100 Subject: [PATCH] blitter: Create helper to set texture param Signed-off-by: Elie Tournier Reviewed-by: Gert Wollny --- src/vrend_blitter.c | 75 +++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/src/vrend_blitter.c b/src/vrend_blitter.c index ff36f88..83a7c0d 100644 --- a/src/vrend_blitter.c +++ b/src/vrend_blitter.c @@ -575,6 +575,46 @@ static void calc_dst_deltas_from_src(const struct pipe_blit_info *info, dst1_delta->dy = src1_delta->dy * scale_y; } +static void vrend_set_tex_param(struct vrend_resource *src_res, + const struct pipe_blit_info *info, + bool has_texture_srgb_decode) +{ + const struct vrend_format_table *src_entry = + vrend_get_format_table_entry_with_emulation(src_res->base.bind, info->src.format); + + if (src_entry->flags & VIRGL_TEXTURE_NEED_SWIZZLE) { + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_R, + to_gl_swizzle(src_entry->swizzle[0])); + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_G, + to_gl_swizzle(src_entry->swizzle[1])); + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_B, + to_gl_swizzle(src_entry->swizzle[2])); + glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_A, + to_gl_swizzle(src_entry->swizzle[3])); + } + + /* Just make sure that no stale state disabled decoding */ + if (has_texture_srgb_decode && util_format_is_srgb(info->src.format) && + src_res->base.nr_samples < 1) + glTexParameteri(src_res->target, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT); + + if (src_res->base.nr_samples < 1) { + glTexParameteri(src_res->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(src_res->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(src_res->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + } + + glTexParameteri(src_res->target, GL_TEXTURE_BASE_LEVEL, info->src.level); + glTexParameteri(src_res->target, GL_TEXTURE_MAX_LEVEL, info->src.level); + + if (src_res->base.nr_samples < 1) { + GLenum filter = info->filter == PIPE_TEX_FILTER_NEAREST ? + GL_NEAREST : GL_LINEAR; + glTexParameterf(src_res->target, GL_TEXTURE_MAG_FILTER, filter); + glTexParameterf(src_res->target, GL_TEXTURE_MIN_FILTER, filter); + } +} + /* implement blitting using OpenGL. */ void vrend_renderer_blit_gl(MAYBE_UNUSED struct vrend_context *ctx, struct vrend_resource *src_res, @@ -600,8 +640,6 @@ void vrend_renderer_blit_gl(MAYBE_UNUSED struct vrend_context *ctx, util_format_description(src_res->base.format); const struct util_format_description *dst_desc = util_format_description(dst_res->base.format); - const struct vrend_format_table *src_entry = - vrend_get_format_table_entry_with_emulation(src_res->base.bind, info->src.format); const struct vrend_format_table *orig_src_entry = vrend_get_format_table_entry(info->src.format); const struct vrend_format_table *dst_entry = vrend_get_format_table_entry_with_emulation(dst_res->base.bind, info->dst.format); @@ -675,38 +713,7 @@ void vrend_renderer_blit_gl(MAYBE_UNUSED struct vrend_context *ctx, glDrawBuffers(1, &buffers); glBindTexture(src_res->target, blit_views[0]); - - if (src_entry->flags & VIRGL_TEXTURE_NEED_SWIZZLE) { - glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_R, - to_gl_swizzle(src_entry->swizzle[0])); - glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_G, - to_gl_swizzle(src_entry->swizzle[1])); - glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_B, - to_gl_swizzle(src_entry->swizzle[2])); - glTexParameteri(src_res->target, GL_TEXTURE_SWIZZLE_A, - to_gl_swizzle(src_entry->swizzle[3])); - } - - /* Just make sure that no stale state disabled decoding */ - if (has_texture_srgb_decode && util_format_is_srgb(info->src.format) && - src_res->base.nr_samples < 1) - glTexParameteri(src_res->target, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT); - - if (src_res->base.nr_samples < 1) { - glTexParameteri(src_res->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(src_res->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(src_res->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - } - - glTexParameteri(src_res->target, GL_TEXTURE_BASE_LEVEL, info->src.level); - glTexParameteri(src_res->target, GL_TEXTURE_MAX_LEVEL, info->src.level); - - if (src_res->base.nr_samples < 1) { - GLenum filter = info->filter == PIPE_TEX_FILTER_NEAREST ? - GL_NEAREST : GL_LINEAR; - glTexParameterf(src_res->target, GL_TEXTURE_MAG_FILTER, filter); - glTexParameterf(src_res->target, GL_TEXTURE_MIN_FILTER, filter); - } + vrend_set_tex_param(src_res, info, has_texture_srgb_decode); pos_loc = glGetAttribLocation(prog_id, "arg0"); tc_loc = glGetAttribLocation(prog_id, "arg1");