Ejemplo n.º 1
0
static texmask
emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
		struct fd_texture_stateobj *tex, unsigned samp_id, texmask emitted)
{
	unsigned const_idx = fd2_get_const_idx(ctx, tex, samp_id);
	static const struct fd2_sampler_stateobj dummy_sampler = {};
	const struct fd2_sampler_stateobj *sampler;
	struct fd2_pipe_sampler_view *view;

	if (emitted & (1 << const_idx))
		return 0;

	sampler = tex->samplers[samp_id] ?
			fd2_sampler_stateobj(tex->samplers[samp_id]) :
			&dummy_sampler;
	view = fd2_pipe_sampler_view(tex->textures[samp_id]);

	OUT_PKT3(ring, CP_SET_CONSTANT, 7);
	OUT_RING(ring, 0x00010000 + (0x6 * const_idx));

	OUT_RING(ring, sampler->tex0 | view->tex0);
	OUT_RELOC(ring, fd_resource(view->base.texture)->bo, 0, view->fmt, 0);
	OUT_RING(ring, view->tex2);
	OUT_RING(ring, sampler->tex3 | view->tex3);
	OUT_RING(ring, sampler->tex4);
	OUT_RING(ring, sampler->tex5);

	return (1 << const_idx);
}
Ejemplo n.º 2
0
static void
patch_tex_fetches(struct fd_context *ctx, struct fd2_shader_stateobj *so,
		struct fd_texture_stateobj *tex)
{
	unsigned i;

	/* update tex fetch instructions: */
	for (i = 0; i < so->num_tfetch_instrs; i++) {
		struct ir2_instruction *instr = so->tfetch_instrs[i].instr;
		unsigned samp_id = so->tfetch_instrs[i].samp_id;
		unsigned const_idx = fd2_get_const_idx(ctx, tex, samp_id);

		if (const_idx != instr->fetch.const_idx) {
			instr->fetch.const_idx = const_idx;
			/* trigger re-assemble: */
			so->info.sizedwords = 0;
		}
	}
}
Ejemplo n.º 3
0
static texmask
emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
		struct fd_texture_stateobj *tex, unsigned samp_id, texmask emitted)
{
	unsigned const_idx = fd2_get_const_idx(ctx, tex, samp_id);
	static const struct fd2_sampler_stateobj dummy_sampler = {};
	static const struct fd2_pipe_sampler_view dummy_view = {};
	const struct fd2_sampler_stateobj *sampler;
	const struct fd2_pipe_sampler_view *view;
	struct fd_resource *rsc;

	if (emitted & (1 << const_idx))
		return 0;

	sampler = tex->samplers[samp_id] ?
			fd2_sampler_stateobj(tex->samplers[samp_id]) :
			&dummy_sampler;
	view = tex->textures[samp_id] ?
			fd2_pipe_sampler_view(tex->textures[samp_id]) :
			&dummy_view;

	rsc = view->base.texture ? fd_resource(view->base.texture) : NULL;

	OUT_PKT3(ring, CP_SET_CONSTANT, 7);
	OUT_RING(ring, 0x00010000 + (0x6 * const_idx));

	OUT_RING(ring, sampler->tex0 | view->tex0);
	if (rsc)
		OUT_RELOC(ring, rsc->bo, 0, view->tex1, 0);
	else
		OUT_RING(ring, 0);

	OUT_RING(ring, view->tex2);
	OUT_RING(ring, sampler->tex3 | view->tex3);
	OUT_RING(ring, sampler->tex4 | view->tex4);

	if (rsc && rsc->base.last_level)
		OUT_RELOC(ring, rsc->bo, fd_resource_offset(rsc, 1, 0), view->tex5, 0);
	else
		OUT_RING(ring, view->tex5);

	return (1 << const_idx);
}