• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 Rob Clark <robclark@freedesktop.org>
3  * Copyright © 2018 Google, Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  *
24  * Authors:
25  *    Rob Clark <robclark@freedesktop.org>
26  */
27 
28 #ifndef FD6_PROGRAM_H_
29 #define FD6_PROGRAM_H_
30 
31 #include "pipe/p_context.h"
32 #include "freedreno_context.h"
33 
34 #include "ir3/ir3_shader.h"
35 #include "ir3_cache.h"
36 
37 struct fd6_emit;
38 
39 struct fd6_program_state {
40    struct ir3_program_state base;
41    const struct ir3_shader_variant *bs; /* binning pass vs */
42    const struct ir3_shader_variant *vs;
43    const struct ir3_shader_variant *hs;
44    const struct ir3_shader_variant *ds;
45    const struct ir3_shader_variant *gs;
46    const struct ir3_shader_variant *fs;
47    struct fd_ringbuffer *config_stateobj;
48    struct fd_ringbuffer *interp_stateobj;
49    struct fd_ringbuffer *binning_stateobj;
50    struct fd_ringbuffer *streamout_stateobj;
51    struct fd_ringbuffer *stateobj;
52 
53    const struct ir3_stream_output_info *stream_output;
54 
55    /**
56     * Whether multiple viewports are used is determined by whether
57     * the last shader stage writes viewport id
58     */
59    uint16_t num_viewports;
60 
61    /**
62     * The # of shader stages that need driver params.
63     */
64    uint8_t num_driver_params;
65 
66    /**
67     * Output components from frag shader.  It is possible to have
68     * a fragment shader that only writes a subset of the bound
69     * render targets.
70     */
71    uint32_t mrt_components;
72 
73    /**
74     * Rather than calculating user consts state size each draw,
75     * calculate it up-front.
76     */
77    uint32_t user_consts_cmdstream_size;
78 
79    /**
80     * The FS contribution to LRZ state
81     */
82    struct fd6_lrz_state lrz_mask;
83 };
84 
85 static inline struct fd6_program_state *
fd6_program_state(struct ir3_program_state * state)86 fd6_program_state(struct ir3_program_state *state)
87 {
88    return (struct fd6_program_state *)state;
89 }
90 
91 static inline const struct ir3_shader_variant *
fd6_last_shader(const struct fd6_program_state * state)92 fd6_last_shader(const struct fd6_program_state *state)
93 {
94    if (state->gs)
95       return state->gs;
96    else if (state->ds)
97       return state->ds;
98    else
99       return state->vs;
100 }
101 
102 void fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring,
103                      const struct ir3_shader_variant *so) assert_dt;
104 
105 struct fd_ringbuffer *fd6_program_interp_state(struct fd6_emit *emit) assert_dt;
106 
107 template <chip CHIP>
108 void fd6_prog_init(struct pipe_context *pctx);
109 
110 #endif /* FD6_PROGRAM_H_ */
111