X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_atom_sampler.c;h=b74d47b691fed88ca8f981942bd97bb42fb6aa8d;hb=013d9e40feed336d983b728357e4ce77b871c36d;hp=5eb8584cf7ebf89dbb0dcb4f864ee8f11675be5f;hpb=c8459846905bf7adfb6b5010a77aee9269228bdb;p=mesa.git diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index 5eb8584cf7e..b74d47b691f 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -43,13 +43,14 @@ #include "st_cb_texture.h" #include "st_format.h" #include "st_atom.h" +#include "st_sampler_view.h" #include "st_texture.h" #include "pipe/p_context.h" #include "pipe/p_defines.h" #include "cso_cache/cso_context.h" -#include "util/u_format.h" +#include "util/format/u_format.h" /** @@ -105,6 +106,7 @@ void st_convert_sampler(const struct st_context *st, const struct gl_texture_object *texobj, const struct gl_sampler_object *msamp, + float tex_unit_lod_bias, struct pipe_sampler_state *sampler) { memset(sampler, 0, sizeof(*sampler)); @@ -119,7 +121,7 @@ st_convert_sampler(const struct st_context *st, if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB) sampler->normalized_coords = 1; - sampler->lod_bias = msamp->LodBias; + sampler->lod_bias = msamp->LodBias + tex_unit_lod_bias; /* Reduce the number of states by allowing only the values that AMD GCN * can represent. Apps use lod_bias for smooth transitions to bigger mipmap * levels. @@ -139,36 +141,45 @@ st_convert_sampler(const struct st_context *st, assert(sampler->min_lod <= sampler->max_lod); } + /* Check that only wrap modes using the border color have the first bit + * set. + */ + STATIC_ASSERT(PIPE_TEX_WRAP_CLAMP & 0x1); + STATIC_ASSERT(PIPE_TEX_WRAP_CLAMP_TO_BORDER & 0x1); + STATIC_ASSERT(PIPE_TEX_WRAP_MIRROR_CLAMP & 0x1); + STATIC_ASSERT(PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER & 0x1); + STATIC_ASSERT(((PIPE_TEX_WRAP_REPEAT | + PIPE_TEX_WRAP_CLAMP_TO_EDGE | + PIPE_TEX_WRAP_MIRROR_REPEAT | + PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE) & 0x1) == 0); + /* For non-black borders... */ - if (msamp->BorderColor.ui[0] || - msamp->BorderColor.ui[1] || - msamp->BorderColor.ui[2] || - msamp->BorderColor.ui[3]) { + if (/* This is true if wrap modes are using the border color: */ + (sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1 && + (msamp->BorderColor.ui[0] || + msamp->BorderColor.ui[1] || + msamp->BorderColor.ui[2] || + msamp->BorderColor.ui[3])) { const GLboolean is_integer = texobj->_IsIntegerFormat; GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat; + if (texobj->StencilSampling) + texBaseFormat = GL_STENCIL_INDEX; + if (st->apply_texture_swizzle_to_border_color) { const struct st_texture_object *stobj = st_texture_object_const(texobj); - const struct pipe_sampler_view *sv = NULL; - - /* Just search for the first used view. We can do this because the - swizzle is per-texture, not per context. */ /* XXX: clean that up to not use the sampler view at all */ - for (unsigned i = 0; i < stobj->num_sampler_views; ++i) { - if (stobj->sampler_views[i]) { - sv = stobj->sampler_views[i]; - break; - } - } + const struct st_sampler_view *sv = st_texture_get_current_sampler_view(st, stobj); if (sv) { + struct pipe_sampler_view *view = sv->view; union pipe_color_union tmp; const unsigned char swz[4] = { - sv->swizzle_r, - sv->swizzle_g, - sv->swizzle_b, - sv->swizzle_a, + view->swizzle_r, + view->swizzle_g, + view->swizzle_b, + view->swizzle_a, }; st_translate_color(&msamp->BorderColor, &tmp, @@ -227,9 +238,9 @@ st_convert_sampler_from_unit(const struct st_context *st, msamp = _mesa_get_samplerobj(ctx, texUnit); - st_convert_sampler(st, texobj, msamp, sampler); + st_convert_sampler(st, texobj, msamp, ctx->Texture.Unit[texUnit].LodBias, + sampler); - sampler->lod_bias += ctx->Texture.Unit[texUnit].LodBias; sampler->seamless_cube_map |= ctx->Texture.CubeMapSeamless; } @@ -250,10 +261,17 @@ update_shader_samplers(struct st_context *st, GLbitfield free_slots = ~prog->SamplersUsed; GLbitfield external_samplers_used = prog->ExternalSamplersUsed; unsigned unit, num_samplers; + struct pipe_sampler_state local_samplers[PIPE_MAX_SAMPLERS]; const struct pipe_sampler_state *states[PIPE_MAX_SAMPLERS]; - if (samplers_used == 0x0) + if (samplers_used == 0x0) { + if (out_num_samplers) + *out_num_samplers = 0; return; + } + + if (!samplers) + samplers = local_samplers; num_samplers = util_last_bit(samplers_used); @@ -286,11 +304,16 @@ update_shader_samplers(struct st_context *st, st_get_texture_object(st->ctx, prog, unit); struct pipe_sampler_state *sampler = samplers + unit; - if (!stObj) + /* if resource format matches then YUV wasn't lowered */ + if (!stObj || st_get_view_format(stObj) == stObj->pt->format) continue; switch (st_get_view_format(stObj)) { case PIPE_FORMAT_NV12: + case PIPE_FORMAT_P010: + case PIPE_FORMAT_P016: + case PIPE_FORMAT_YUYV: + case PIPE_FORMAT_UYVY: /* we need one additional sampler: */ extra = u_bit_scan(&free_slots); states[extra] = sampler; @@ -310,7 +333,9 @@ update_shader_samplers(struct st_context *st, } cso_set_samplers(st->cso_context, shader_stage, num_samplers, states); - *out_num_samplers = num_samplers; + + if (out_num_samplers) + *out_num_samplers = num_samplers; } @@ -322,8 +347,8 @@ st_update_vertex_samplers(struct st_context *st) update_shader_samplers(st, PIPE_SHADER_VERTEX, ctx->VertexProgram._Current, - st->state.samplers[PIPE_SHADER_VERTEX], - &st->state.num_samplers[PIPE_SHADER_VERTEX]); + st->state.vert_samplers, + &st->state.num_vert_samplers); } @@ -335,9 +360,7 @@ st_update_tessctrl_samplers(struct st_context *st) if (ctx->TessCtrlProgram._Current) { update_shader_samplers(st, PIPE_SHADER_TESS_CTRL, - ctx->TessCtrlProgram._Current, - st->state.samplers[PIPE_SHADER_TESS_CTRL], - &st->state.num_samplers[PIPE_SHADER_TESS_CTRL]); + ctx->TessCtrlProgram._Current, NULL, NULL); } } @@ -350,9 +373,7 @@ st_update_tesseval_samplers(struct st_context *st) if (ctx->TessEvalProgram._Current) { update_shader_samplers(st, PIPE_SHADER_TESS_EVAL, - ctx->TessEvalProgram._Current, - st->state.samplers[PIPE_SHADER_TESS_EVAL], - &st->state.num_samplers[PIPE_SHADER_TESS_EVAL]); + ctx->TessEvalProgram._Current, NULL, NULL); } } @@ -365,9 +386,7 @@ st_update_geometry_samplers(struct st_context *st) if (ctx->GeometryProgram._Current) { update_shader_samplers(st, PIPE_SHADER_GEOMETRY, - ctx->GeometryProgram._Current, - st->state.samplers[PIPE_SHADER_GEOMETRY], - &st->state.num_samplers[PIPE_SHADER_GEOMETRY]); + ctx->GeometryProgram._Current, NULL, NULL); } } @@ -380,8 +399,8 @@ st_update_fragment_samplers(struct st_context *st) update_shader_samplers(st, PIPE_SHADER_FRAGMENT, ctx->FragmentProgram._Current, - st->state.samplers[PIPE_SHADER_FRAGMENT], - &st->state.num_samplers[PIPE_SHADER_FRAGMENT]); + st->state.frag_samplers, + &st->state.num_frag_samplers); } @@ -393,8 +412,6 @@ st_update_compute_samplers(struct st_context *st) if (ctx->ComputeProgram._Current) { update_shader_samplers(st, PIPE_SHADER_COMPUTE, - ctx->ComputeProgram._Current, - st->state.samplers[PIPE_SHADER_COMPUTE], - &st->state.num_samplers[PIPE_SHADER_COMPUTE]); + ctx->ComputeProgram._Current, NULL, NULL); } }