si_state.h revision 84fdda280f4361add3802476ce9a30ac1c0b4c69
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright 2012 Advanced Micro Devices, Inc.
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * copy of this software and associated documentation files (the "Software"),
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * to deal in the Software without restriction, including without limitation
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * on the rights to use, copy, modify, merge, publish, distribute, sub
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * license, and/or sell copies of the Software, and to permit persons to whom
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * the Software is furnished to do so, subject to the following conditions:
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The above copyright notice and this permission notice (including the next
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * paragraph) shall be included in all copies or substantial portions of the
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Software.
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * USE OR OTHER DEALINGS IN THE SOFTWARE.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Authors:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *      Christian König <christian.koenig@amd.com>
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SI_STATE_H
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SI_STATE_H
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "radeonsi_pm4.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_blend {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct si_pm4_state	pm4;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	uint32_t		cb_target_mask;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	uint32_t		cb_color_control;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_viewport {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct si_pm4_state		pm4;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct pipe_viewport_state	viewport;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_rasterizer {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct si_pm4_state	pm4;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	bool			flatshade;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		sprite_coord_enable;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		pa_sc_line_stipple;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		pa_su_sc_mode_cntl;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		pa_cl_clip_cntl;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		pa_cl_vs_out_cntl;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	float			offset_units;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	float			offset_scale;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_state_dsa {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct si_pm4_state	pm4;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		alpha_ref;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		db_render_override;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned		db_render_control;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	uint8_t			valuemask[2];
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	uint8_t			writemask[2];
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct si_vertex_element
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned			count;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	uint32_t			rsrc_word3[PIPE_MAX_ATTRIBS];
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct pipe_vertex_element	elements[PIPE_MAX_ATTRIBS];
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)union si_state {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	struct {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*sync;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*init;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_state_blend		*blend;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*blend_color;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*clip;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*scissor;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_state_viewport	*viewport;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*framebuffer;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_state_rasterizer	*rasterizer;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_state_dsa		*dsa;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*fb_rs;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*fb_blend;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*dsa_stencil_ref;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*vs;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*vs_const;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		struct si_pm4_state		*ps;
89		struct si_pm4_state		*ps_sampler_views;
90		struct si_pm4_state		*ps_sampler;
91		struct si_pm4_state		*ps_const;
92		struct si_pm4_state		*spi;
93		struct si_pm4_state		*vertex_buffers;
94		struct si_pm4_state		*texture_barrier;
95		struct si_pm4_state		*draw_info;
96		struct si_pm4_state		*draw;
97	} named;
98	struct si_pm4_state	*array[0];
99};
100
101#define si_pm4_block_idx(member) \
102	(offsetof(union si_state, named.member) / sizeof(struct si_pm4_state *))
103
104#define si_pm4_bind_state(rctx, member, value) \
105	do { \
106		(rctx)->queued.named.member = (value); \
107	} while(0)
108
109#define si_pm4_delete_state(rctx, member, value) \
110	do { \
111		if ((rctx)->queued.named.member == (value)) { \
112			(rctx)->queued.named.member = NULL; \
113		} \
114		si_pm4_free_state(rctx, (struct si_pm4_state *)(value), \
115				  si_pm4_block_idx(member)); \
116	} while(0)
117
118#define si_pm4_set_state(rctx, member, value) \
119	do { \
120		if ((rctx)->queued.named.member != (value)) { \
121			si_pm4_free_state(rctx, \
122				(struct si_pm4_state *)(rctx)->queued.named.member, \
123				si_pm4_block_idx(member)); \
124			(rctx)->queued.named.member = (value); \
125		} \
126	} while(0)
127
128/* si_state.c */
129bool si_is_format_supported(struct pipe_screen *screen,
130			    enum pipe_format format,
131			    enum pipe_texture_target target,
132			    unsigned sample_count,
133			    unsigned usage);
134void si_init_state_functions(struct r600_context *rctx);
135void si_init_config(struct r600_context *rctx);
136
137/* si_state_streamout.c */
138struct pipe_stream_output_target *
139si_create_so_target(struct pipe_context *ctx,
140		    struct pipe_resource *buffer,
141		    unsigned buffer_offset,
142		    unsigned buffer_size);
143void si_so_target_destroy(struct pipe_context *ctx,
144			  struct pipe_stream_output_target *target);
145void si_set_so_targets(struct pipe_context *ctx,
146		       unsigned num_targets,
147		       struct pipe_stream_output_target **targets,
148		       unsigned append_bitmask);
149
150/* si_state_draw.c */
151void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
152
153/* si_commands.c */
154void si_cmd_surface_sync(struct si_pm4_state *pm4, uint32_t cp_coher_cntl);
155
156#endif
157