12855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
22855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
32855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/*
42855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Copyright (C) 2013 Rob Clark <robclark@freedesktop.org>
52855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *
62855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Permission is hereby granted, free of charge, to any person obtaining a
72855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * copy of this software and associated documentation files (the "Software"),
82855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * to deal in the Software without restriction, including without limitation
92855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense,
102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * and/or sell copies of the Software, and to permit persons to whom the
112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software is furnished to do so, subject to the following conditions:
122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *
132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * The above copyright notice and this permission notice (including the next
142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * paragraph) shall be included in all copies or substantial portions of the
152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software.
162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *
172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * SOFTWARE.
242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *
252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Authors:
262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *    Rob Clark <robclark@freedesktop.org>
272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */
282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#ifndef FD3_EMIT_H
302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define FD3_EMIT_H
312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "pipe/p_context.h"
332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "freedreno_context.h"
353338bfcf498aa93a256aaadaee25951d4864f78fIlia Mirkin#include "fd3_format.h"
36d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark#include "fd3_program.h"
37db193e5ad06e7a2fbcffb3bb5df85d212eb12291Rob Clark#include "ir3_shader.h"
382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstruct fd_ringbuffer;
402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkvoid fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring,
424a3c0e995063320693782b934962969e11dab29dIlia Mirkin		struct pipe_surface **psurf, int bufs);
432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
44d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark/* grouped together emit-state for prog/vertex/state emit: */
45d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clarkstruct fd3_emit {
4651f20dd279f420492779e4256b111d65f6fc0917Rob Clark	struct pipe_debug_callback *debug;
47d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	const struct fd_vertex_state *vtx;
48d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	const struct fd_program_stateobj *prog;
49d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	const struct pipe_draw_info *info;
50d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	struct ir3_shader_key key;
51d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	uint32_t dirty;
52ee670c9efa471aa78563b14f47bcd89220b608dcIlia Mirkin
53ee670c9efa471aa78563b14f47bcd89220b608dcIlia Mirkin	uint32_t sprite_coord_enable;
54b060b56772cdb349478757382de036a20a2402baIlia Mirkin	bool sprite_coord_mode;
55d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	bool rasterflat;
56d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark
57d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	/* cached to avoid repeated lookups of same variants: */
5809b34473446163eb737c2b183095c0342eab7eeaRob Clark	const struct ir3_shader_variant *vp, *fp;
59d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark};
60d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark
6109b34473446163eb737c2b183095c0342eab7eeaRob Clarkstatic inline const struct ir3_shader_variant *
62d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clarkfd3_emit_get_vp(struct fd3_emit *emit)
63d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark{
64d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	if (!emit->vp) {
65d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark		struct fd3_shader_stateobj *so = emit->prog->vp;
66663c0e5155e9916b10163c102f0ece4eda5c3154Rob Clark		emit->vp = ir3_shader_variant(so->shader, emit->key, emit->debug);
67d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	}
68d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	return emit->vp;
69d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark}
70d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark
7109b34473446163eb737c2b183095c0342eab7eeaRob Clarkstatic inline const struct ir3_shader_variant *
72d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clarkfd3_emit_get_fp(struct fd3_emit *emit)
73d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark{
74d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	if (!emit->fp) {
75476551a21fbb255a3effa7aa46801764a38ef213Rob Clark		if (emit->key.binning_pass) {
76476551a21fbb255a3effa7aa46801764a38ef213Rob Clark			/* use dummy stateobj to simplify binning vs non-binning: */
77476551a21fbb255a3effa7aa46801764a38ef213Rob Clark			static const struct ir3_shader_variant binning_fp = {};
78476551a21fbb255a3effa7aa46801764a38ef213Rob Clark			emit->fp = &binning_fp;
79476551a21fbb255a3effa7aa46801764a38ef213Rob Clark		} else {
80476551a21fbb255a3effa7aa46801764a38ef213Rob Clark			struct fd3_shader_stateobj *so = emit->prog->fp;
81663c0e5155e9916b10163c102f0ece4eda5c3154Rob Clark			emit->fp = ir3_shader_variant(so->shader, emit->key, emit->debug);
82476551a21fbb255a3effa7aa46801764a38ef213Rob Clark		}
83d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	}
84d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark	return emit->fp;
85d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark}
86d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark
87d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clarkvoid fd3_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd3_emit *emit);
88d5d80b37392c7f15c4fb39b6b1826230239930fdRob Clark
89c0766528baaef48902c87bbdaa4f5926c472269bRob Clarkvoid fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
90d595987ea3d1706fecb9f6416031ec8b27c95a9eRob Clark		struct fd3_emit *emit);
91d5d80b37392c7f15c4fb39b6b1826230239930fdRob Clark
927f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clarkvoid fd3_emit_restore(struct fd_batch *batch, struct fd_ringbuffer *ring);
932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark
9456462a30080c1f25a81ae566d59a25d2ad6bb809Rob Clarkvoid fd3_emit_init(struct pipe_context *pctx);
9556462a30080c1f25a81ae566d59a25d2ad6bb809Rob Clark
966206da736c84c4f7316ab586c886b4865fda8805Rob Clarkstatic inline void
97e6bfe1c7734cfbf41a763797527db6cb49fa1566Rob Clarkfd3_emit_cache_flush(struct fd_batch *batch, struct fd_ringbuffer *ring)
986206da736c84c4f7316ab586c886b4865fda8805Rob Clark{
99e6bfe1c7734cfbf41a763797527db6cb49fa1566Rob Clark	fd_wfi(batch, ring);
1006206da736c84c4f7316ab586c886b4865fda8805Rob Clark	OUT_PKT0(ring, REG_A3XX_UCHE_CACHE_INVALIDATE0_REG, 2);
1016206da736c84c4f7316ab586c886b4865fda8805Rob Clark	OUT_RING(ring, A3XX_UCHE_CACHE_INVALIDATE0_REG_ADDR(0));
1026206da736c84c4f7316ab586c886b4865fda8805Rob Clark	OUT_RING(ring, A3XX_UCHE_CACHE_INVALIDATE1_REG_ADDR(0) |
1036206da736c84c4f7316ab586c886b4865fda8805Rob Clark			A3XX_UCHE_CACHE_INVALIDATE1_REG_OPCODE(INVALIDATE) |
1046206da736c84c4f7316ab586c886b4865fda8805Rob Clark			A3XX_UCHE_CACHE_INVALIDATE1_REG_ENTIRE_CACHE);
1056206da736c84c4f7316ab586c886b4865fda8805Rob Clark}
1066206da736c84c4f7316ab586c886b4865fda8805Rob Clark
1072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#endif /* FD3_EMIT_H */
108