1bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König/* 2bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Copyright 2012 Advanced Micro Devices, Inc. 3bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 4bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Permission is hereby granted, free of charge, to any person obtaining a 5bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * copy of this software and associated documentation files (the "Software"), 6bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * to deal in the Software without restriction, including without limitation 7bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * on the rights to use, copy, modify, merge, publish, distribute, sub 8bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * license, and/or sell copies of the Software, and to permit persons to whom 9bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * the Software is furnished to do so, subject to the following conditions: 10bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 11bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * The above copyright notice and this permission notice (including the next 12bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * paragraph) shall be included in all copies or substantial portions of the 13bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Software. 14bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 15bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * USE OR OTHER DEALINGS IN THE SOFTWARE. 22bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * 23bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Authors: 24bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König * Christian König <christian.koenig@amd.com> 25bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König */ 26bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 27bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#ifndef SI_STATE_H 28bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define SI_STATE_H 29bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 30bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#include "radeonsi_pm4.h" 31bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 3263636ae52aefc275115d1f3daac4e75285583485Christian Königstruct si_state_blend { 3363636ae52aefc275115d1f3daac4e75285583485Christian König struct si_pm4_state pm4; 3463636ae52aefc275115d1f3daac4e75285583485Christian König uint32_t cb_target_mask; 3563636ae52aefc275115d1f3daac4e75285583485Christian König uint32_t cb_color_control; 3663636ae52aefc275115d1f3daac4e75285583485Christian König}; 3763636ae52aefc275115d1f3daac4e75285583485Christian König 387e011d92c9746ba4050890442db6e504fa42c4adChristian Königstruct si_state_viewport { 397e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_pm4_state pm4; 407e011d92c9746ba4050890442db6e504fa42c4adChristian König struct pipe_viewport_state viewport; 417e011d92c9746ba4050890442db6e504fa42c4adChristian König}; 427e011d92c9746ba4050890442db6e504fa42c4adChristian König 43f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian Königstruct si_state_rasterizer { 44f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_pm4_state pm4; 45f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König bool flatshade; 46f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned sprite_coord_enable; 47f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned pa_sc_line_stipple; 48f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned pa_su_sc_mode_cntl; 49f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned pa_cl_clip_cntl; 50f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König unsigned pa_cl_vs_out_cntl; 51f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König float offset_units; 52f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König float offset_scale; 53f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König}; 54f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König 55b41b3eb9893b9bac8df363fef4d10c68798616e2Christian Königstruct si_state_dsa { 56b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_pm4_state pm4; 57b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned alpha_ref; 58b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned db_render_override; 59b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König unsigned db_render_control; 60b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König uint8_t valuemask[2]; 61b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König uint8_t writemask[2]; 62b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König}; 63b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König 643c09f11e5cefd437bb8185539430786dc245c96fChristian Königstruct si_vertex_element 653c09f11e5cefd437bb8185539430786dc245c96fChristian König{ 66b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König unsigned count; 67b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König uint32_t rsrc_word3[PIPE_MAX_ATTRIBS]; 68b15e3ae5b423dd8846a35500c0274d1d74f6b836Christian König struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS]; 693c09f11e5cefd437bb8185539430786dc245c96fChristian König}; 703c09f11e5cefd437bb8185539430786dc245c96fChristian König 71bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian Königunion si_state { 72bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König struct { 73583c212115795bef65da92761180ce830fafc927Christian König struct si_pm4_state *sync; 74840f05da6b92ba5266385836533842b9a9fc5da9Christian König struct si_pm4_state *init; 757e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_state_blend *blend; 767e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_pm4_state *blend_color; 777e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_pm4_state *clip; 787e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_pm4_state *scissor; 797e011d92c9746ba4050890442db6e504fa42c4adChristian König struct si_state_viewport *viewport; 80835098a5290e59bb7b468eb987db67b0e1913c67Christian König struct si_pm4_state *framebuffer; 81f67fae0e43fa0909b57b8a07858d37caecd5cbb1Christian König struct si_state_rasterizer *rasterizer; 82b41b3eb9893b9bac8df363fef4d10c68798616e2Christian König struct si_state_dsa *dsa; 83bd18a316e1495f501911d89c8b373382d1f8c8c2Christian König struct si_pm4_state *fb_rs; 8476660dfccede74782ac0d409da171ddbd61fae41Christian König struct si_pm4_state *fb_blend; 85e6937211da019223ca3b8fd0be6ed5a5fe35c706Christian König struct si_pm4_state *dsa_stencil_ref; 863c09f11e5cefd437bb8185539430786dc245c96fChristian König struct si_pm4_state *vs; 870d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct si_pm4_state *vs_const; 880d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct si_pm4_state *ps; 89baf20397569fb499f736e5ad2350b008b8207fadChristian König struct si_pm4_state *ps_sampler_views; 900d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct si_pm4_state *ps_sampler; 910d6b0b512acadbc5d64039063b5649fc401b3367Christian König struct si_pm4_state *ps_const; 92bd2a5cf328c21f2d5b243442ee2eac73a996b15cChristian König struct si_pm4_state *spi; 93ca9cf611b63e5576b596c21b73b1b639d250d649Christian König struct si_pm4_state *vertex_buffers; 949b213c871a080472660eff271c72a3fcc5d3f578Christian König struct si_pm4_state *texture_barrier; 95e4e6f954ae8c83251c39da4327c29ba12fca8236Christian König struct si_pm4_state *draw_info; 969f5ff5981cfc1b1eb613890e4f8cec6a448611ccChristian König struct si_pm4_state *draw; 97bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König } named; 98bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König struct si_pm4_state *array[0]; 99bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König}; 100bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 101bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_block_idx(member) \ 102bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König (offsetof(union si_state, named.member) / sizeof(struct si_pm4_state *)) 103bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 104bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_bind_state(rctx, member, value) \ 105bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König do { \ 106bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König (rctx)->queued.named.member = (value); \ 10784fdda280f4361add3802476ce9a30ac1c0b4c69Michel Dänzer } while(0) 108bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 109bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_delete_state(rctx, member, value) \ 110bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König do { \ 111bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König if ((rctx)->queued.named.member == (value)) { \ 112bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König (rctx)->queued.named.member = NULL; \ 113bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König } \ 114bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König si_pm4_free_state(rctx, (struct si_pm4_state *)(value), \ 115bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König si_pm4_block_idx(member)); \ 11684fdda280f4361add3802476ce9a30ac1c0b4c69Michel Dänzer } while(0) 117bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 118bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#define si_pm4_set_state(rctx, member, value) \ 119bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König do { \ 120bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König if ((rctx)->queued.named.member != (value)) { \ 121bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König si_pm4_free_state(rctx, \ 122bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König (struct si_pm4_state *)(rctx)->queued.named.member, \ 123bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König si_pm4_block_idx(member)); \ 124bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König (rctx)->queued.named.member = (value); \ 125bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König } \ 12684fdda280f4361add3802476ce9a30ac1c0b4c69Michel Dänzer } while(0) 127bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König 128ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* si_state.c */ 129d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerstruct si_pipe_shader_selector; 130d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer 13153d47889e67b3de5267d55b90b2110802a6e7dc0Christian Königbool si_is_format_supported(struct pipe_screen *screen, 13253d47889e67b3de5267d55b90b2110802a6e7dc0Christian König enum pipe_format format, 13353d47889e67b3de5267d55b90b2110802a6e7dc0Christian König enum pipe_texture_target target, 13453d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned sample_count, 13553d47889e67b3de5267d55b90b2110802a6e7dc0Christian König unsigned usage); 136d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzerint si_shader_select(struct pipe_context *ctx, 137d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer struct si_pipe_shader_selector *sel, 138d1e40b3d40b2e90ad4f275565f1ae27fe6f964ccMichel Dänzer unsigned *dirty); 13963636ae52aefc275115d1f3daac4e75285583485Christian Königvoid si_init_state_functions(struct r600_context *rctx); 140840f05da6b92ba5266385836533842b9a9fc5da9Christian Königvoid si_init_config(struct r600_context *rctx); 141ca9cf611b63e5576b596c21b73b1b639d250d649Christian König 142303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König/* si_state_streamout.c */ 143303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königstruct pipe_stream_output_target * 144303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königsi_create_so_target(struct pipe_context *ctx, 145303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König struct pipe_resource *buffer, 146303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König unsigned buffer_offset, 147303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König unsigned buffer_size); 148303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_so_target_destroy(struct pipe_context *ctx, 149303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König struct pipe_stream_output_target *target); 150303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian Königvoid si_set_so_targets(struct pipe_context *ctx, 151303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König unsigned num_targets, 152303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König struct pipe_stream_output_target **targets, 153303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König unsigned append_bitmask); 154303f4b7dcddee384d6f1dc1027cbdee840a38d7dChristian König 155ca9cf611b63e5576b596c21b73b1b639d250d649Christian König/* si_state_draw.c */ 156ca9cf611b63e5576b596c21b73b1b639d250d649Christian Königvoid si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo); 15763636ae52aefc275115d1f3daac4e75285583485Christian König 158583c212115795bef65da92761180ce830fafc927Christian König/* si_commands.c */ 159583c212115795bef65da92761180ce830fafc927Christian Königvoid si_cmd_surface_sync(struct si_pm4_state *pm4, uint32_t cp_coher_cntl); 160583c212115795bef65da92761180ce830fafc927Christian König 161bf7302a6e1f3aed4518498e90e8261a2b1f6afd7Christian König#endif 162