fd4_emit.h revision e9589a8fcf60f9d04ea31e6f84f43f9d10a636da
161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark/*
461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Copyright (C) 2014 Rob Clark <robclark@freedesktop.org>
561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark *
661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Permission is hereby granted, free of charge, to any person obtaining a
761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * copy of this software and associated documentation files (the "Software"),
861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * to deal in the Software without restriction, including without limitation
961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * and/or sell copies of the Software, and to permit persons to whom the
1161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Software is furnished to do so, subject to the following conditions:
1261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark *
1361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * The above copyright notice and this permission notice (including the next
1461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * paragraph) shall be included in all copies or substantial portions of the
1561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Software.
1661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark *
1761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * SOFTWARE.
2461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark *
2561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark * Authors:
2661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark *    Rob Clark <robclark@freedesktop.org>
2761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark */
2861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
2961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#ifndef FD4_EMIT_H
3061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#define FD4_EMIT_H
3161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
3261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "pipe/p_context.h"
3361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
3461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "freedreno_context.h"
35e9589a8fcf60f9d04ea31e6f84f43f9d10a636daRob Clark#include "fd4_format.h"
3661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "fd4_program.h"
3761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#include "ir3_shader.h"
3861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
3961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkstruct fd_ringbuffer;
4061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkenum adreno_state_block;
4161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
4261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_constant(struct fd_ringbuffer *ring,
4361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		enum adreno_state_block sb,
4461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		uint32_t regid, uint32_t offset, uint32_t sizedwords,
4561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		const uint32_t *dwords, struct pipe_resource *prsc);
4661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
4761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring,
4861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		struct pipe_surface *psurf);
4961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
5061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark/* grouped together emit-state for prog/vertex/state emit: */
5161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkstruct fd4_emit {
5261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	const struct fd_vertex_state *vtx;
5361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	const struct fd_program_stateobj *prog;
5461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	const struct pipe_draw_info *info;
5561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	struct ir3_shader_key key;
563e698ebf44b443f28badf7443cf9516fc404871dRob Clark	enum a4xx_color_fmt format;
5761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	uint32_t dirty;
5861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	bool rasterflat;
5961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
6061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	/* cached to avoid repeated lookups of same variants: */
6161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	struct ir3_shader_variant *vp, *fp;
6261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	/* TODO: other shader stages.. */
6361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark};
6461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
653e698ebf44b443f28badf7443cf9516fc404871dRob Clarkstatic inline enum a4xx_color_fmt fd4_emit_format(struct pipe_surface *surf)
663e698ebf44b443f28badf7443cf9516fc404871dRob Clark{
673e698ebf44b443f28badf7443cf9516fc404871dRob Clark	if (!surf)
683e698ebf44b443f28badf7443cf9516fc404871dRob Clark		return 0;
693e698ebf44b443f28badf7443cf9516fc404871dRob Clark	return fd4_pipe2color(surf->format);
703e698ebf44b443f28badf7443cf9516fc404871dRob Clark}
713e698ebf44b443f28badf7443cf9516fc404871dRob Clark
7261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkstatic inline struct ir3_shader_variant *
7361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkfd4_emit_get_vp(struct fd4_emit *emit)
7461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark{
7561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	if (!emit->vp) {
7661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		struct fd4_shader_stateobj *so = emit->prog->vp;
7761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		emit->vp = ir3_shader_variant(so->shader, emit->key);
7861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	}
7961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	return emit->vp;
8061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark}
8161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
8261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkstatic inline struct ir3_shader_variant *
8361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkfd4_emit_get_fp(struct fd4_emit *emit)
8461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark{
8561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	if (!emit->fp) {
8661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		struct fd4_shader_stateobj *so = emit->prog->fp;
8761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		emit->fp = ir3_shader_variant(so->shader, emit->key);
8861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	}
8961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark	return emit->fp;
9061c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark}
9161c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
9261c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd4_emit *emit);
9361c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
9461c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
9561c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark		struct fd4_emit *emit);
9661c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
9761c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clarkvoid fd4_emit_restore(struct fd_context *ctx);
9861c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark
9961c68b69d704b5faa5ff9d2b73b24bebf7e19412Rob Clark#endif /* FD4_EMIT_H */
100