#include "st_format.h"
#include "st_cb_texture.h"
#include "pipe/p_context.h"
-#include "util/u_format.h"
+#include "util/format/u_format.h"
#include "util/u_inlines.h"
#include "cso_cache/cso_context.h"
update_textures(struct st_context *st,
enum pipe_shader_type shader_stage,
const struct gl_program *prog,
- struct pipe_sampler_view **sampler_views,
- unsigned *out_num_textures)
+ struct pipe_sampler_view **sampler_views)
{
- const GLuint old_max = *out_num_textures;
+ const GLuint old_max = st->state.num_sampler_views[shader_stage];
GLbitfield samplers_used = prog->SamplersUsed;
- GLbitfield texel_fetch_samplers = prog->TexelFetchSamplers;
+ GLbitfield texel_fetch_samplers = prog->info.textures_used_by_txf;
GLbitfield free_slots = ~prog->SamplersUsed;
GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
GLuint unit;
/* use original view as template: */
tmpl = *sampler_views[unit];
+ /* if resource format matches then YUV wasn't lowered */
+ if (st_get_view_format(stObj) == stObj->pt->format)
+ continue;
+
switch (st_get_view_format(stObj)) {
case PIPE_FORMAT_NV12:
/* we need one additional R8G8 view: */
sampler_views[extra] =
st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
break;
+ case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P016:
+ /* we need one additional R16G16 view: */
+ tmpl.format = PIPE_FORMAT_RG1616_UNORM;
+ tmpl.swizzle_g = PIPE_SWIZZLE_Y; /* tmpl from Y plane is R16 */
+ extra = u_bit_scan(&free_slots);
+ sampler_views[extra] =
+ st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
+ break;
case PIPE_FORMAT_IYUV:
/* we need two additional R8 views: */
tmpl.format = PIPE_FORMAT_R8_UNORM;
sampler_views[extra] =
st->pipe->create_sampler_view(st->pipe, stObj->pt->next->next, &tmpl);
break;
+ case PIPE_FORMAT_YUYV:
+ /* we need one additional BGRA8888 view: */
+ tmpl.format = PIPE_FORMAT_BGRA8888_UNORM;
+ tmpl.swizzle_b = PIPE_SWIZZLE_Z;
+ tmpl.swizzle_a = PIPE_SWIZZLE_W;
+ extra = u_bit_scan(&free_slots);
+ sampler_views[extra] =
+ st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
+ break;
+ case PIPE_FORMAT_UYVY:
+ /* we need one additional RGBA8888 view: */
+ tmpl.format = PIPE_FORMAT_RGBA8888_UNORM;
+ tmpl.swizzle_b = PIPE_SWIZZLE_Z;
+ tmpl.swizzle_a = PIPE_SWIZZLE_W;
+ extra = u_bit_scan(&free_slots);
+ sampler_views[extra] =
+ st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
+ break;
default:
break;
}
shader_stage,
num_textures,
sampler_views);
- *out_num_textures = num_textures;
+ st->state.num_sampler_views[shader_stage] = num_textures;
}
+/* Same as update_textures, but don't store the views in st_context. */
+static void
+update_textures_local(struct st_context *st,
+ enum pipe_shader_type shader_stage,
+ const struct gl_program *prog)
+{
+ struct pipe_sampler_view *local_views[PIPE_MAX_SAMPLERS] = {0};
+ update_textures(st, shader_stage, prog, local_views);
+
+ unsigned num = st->state.num_sampler_views[shader_stage];
+ for (unsigned i = 0; i < num; i++)
+ pipe_sampler_view_reference(&local_views[i], NULL);
+}
void
st_update_vertex_textures(struct st_context *st)
update_textures(st,
PIPE_SHADER_VERTEX,
ctx->VertexProgram._Current,
- st->state.sampler_views[PIPE_SHADER_VERTEX],
- &st->state.num_sampler_views[PIPE_SHADER_VERTEX]);
+ st->state.vert_sampler_views);
}
}
update_textures(st,
PIPE_SHADER_FRAGMENT,
ctx->FragmentProgram._Current,
- st->state.sampler_views[PIPE_SHADER_FRAGMENT],
- &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
+ st->state.frag_sampler_views);
}
const struct gl_context *ctx = st->ctx;
if (ctx->GeometryProgram._Current) {
- update_textures(st,
- PIPE_SHADER_GEOMETRY,
- ctx->GeometryProgram._Current,
- st->state.sampler_views[PIPE_SHADER_GEOMETRY],
- &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
+ update_textures_local(st, PIPE_SHADER_GEOMETRY,
+ ctx->GeometryProgram._Current);
}
}
const struct gl_context *ctx = st->ctx;
if (ctx->TessCtrlProgram._Current) {
- update_textures(st,
- PIPE_SHADER_TESS_CTRL,
- ctx->TessCtrlProgram._Current,
- st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
- &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]);
+ update_textures_local(st, PIPE_SHADER_TESS_CTRL,
+ ctx->TessCtrlProgram._Current);
}
}
const struct gl_context *ctx = st->ctx;
if (ctx->TessEvalProgram._Current) {
- update_textures(st,
- PIPE_SHADER_TESS_EVAL,
- ctx->TessEvalProgram._Current,
- st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
- &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]);
+ update_textures_local(st, PIPE_SHADER_TESS_EVAL,
+ ctx->TessEvalProgram._Current);
}
}
const struct gl_context *ctx = st->ctx;
if (ctx->ComputeProgram._Current) {
- update_textures(st,
- PIPE_SHADER_COMPUTE,
- ctx->ComputeProgram._Current,
- st->state.sampler_views[PIPE_SHADER_COMPUTE],
- &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
+ update_textures_local(st, PIPE_SHADER_COMPUTE,
+ ctx->ComputeProgram._Current);
}
}