• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 Collabora Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * on the rights to use, copy, modify, merge, publish, distribute, sub
8  * license, and/or sell copies of the Software, and to permit persons to whom
9  * the Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 
24 #ifndef ZINK_PIPELINE_H
25 #define ZINK_PIPELINE_H
26 
27 #include <vulkan/vulkan.h>
28 
29 #include "pipe/p_state.h"
30 #include "zink_shader_keys.h"
31 #include "zink_state.h"
32 
33 struct zink_blend_state;
34 struct zink_depth_stencil_alpha_state;
35 struct zink_gfx_program;
36 struct zink_compute_program;
37 struct zink_rasterizer_state;
38 struct zink_render_pass;
39 struct zink_screen;
40 struct zink_vertex_elements_state;
41 
42 struct zink_pipeline_dynamic_state1 {
43    uint8_t front_face; //VkFrontFace:1
44    uint8_t cull_mode; //VkCullModeFlags:2
45    uint16_t num_viewports;
46    struct zink_depth_stencil_alpha_hw_state *depth_stencil_alpha_state; //must be last
47 };
48 
49 struct zink_pipeline_dynamic_state2 {
50    bool primitive_restart;
51    bool rasterizer_discard;
52    uint16_t vertices_per_patch; //5 bits
53 };
54 
55 struct zink_gfx_pipeline_state {
56    uint32_t rast_state : ZINK_RAST_HW_STATE_SIZE; //zink_rasterizer_hw_state
57    uint32_t rast_samples:15; //9 extra bits
58    uint32_t void_alpha_attachments:PIPE_MAX_COLOR_BUFS;
59    VkSampleMask sample_mask;
60 
61    unsigned rp_state;
62    uint32_t blend_id;
63 
64    /* Pre-hashed value for table lookup, invalid when zero.
65     * Members after this point are not included in pipeline state hash key */
66    uint32_t hash;
67    bool dirty;
68 
69    struct zink_pipeline_dynamic_state1 dyn_state1;
70 
71    struct zink_pipeline_dynamic_state2 dyn_state2;
72 
73    VkShaderModule modules[PIPE_SHADER_TYPES - 1];
74    bool modules_changed;
75 
76    struct zink_vertex_elements_hw_state *element_state;
77    uint32_t vertex_hash;
78 
79    uint32_t final_hash;
80 
81    uint32_t vertex_buffers_enabled_mask;
82    uint32_t vertex_strides[PIPE_MAX_ATTRIBS];
83    bool sample_locations_enabled;
84    bool uses_dynamic_stride;
85    bool have_EXT_extended_dynamic_state;
86    bool have_EXT_extended_dynamic_state2;
87    bool extendedDynamicState2PatchControlPoints;
88    uint8_t has_points; //either gs outputs points or prim type is points
89    struct {
90       struct zink_shader_key key[5];
91       struct zink_shader_key last_vertex;
92    } shader_keys;
93    struct zink_blend_state *blend_state;
94    struct zink_render_pass *render_pass;
95    struct zink_render_pass *next_render_pass; //will be used next time rp is begun
96    VkFormat rendering_formats[PIPE_MAX_COLOR_BUFS];
97    VkPipelineRenderingCreateInfo rendering_info;
98    VkPipeline pipeline;
99    unsigned idx : 8;
100    enum pipe_prim_type gfx_prim_mode; //pending mode
101 };
102 
103 struct zink_compute_pipeline_state {
104    /* Pre-hashed value for table lookup, invalid when zero.
105     * Members after this point are not included in pipeline state hash key */
106    uint32_t hash;
107    uint32_t final_hash;
108    bool dirty;
109    bool use_local_size;
110    uint32_t local_size[3];
111 
112    uint32_t module_hash;
113    VkShaderModule module;
114    bool module_changed;
115 
116    struct zink_shader_key key;
117 
118    VkPipeline pipeline;
119 };
120 
121 VkPipeline
122 zink_create_gfx_pipeline(struct zink_screen *screen,
123                          struct zink_gfx_program *prog,
124                          struct zink_gfx_pipeline_state *state,
125                          const uint8_t *binding_map,
126                          VkPrimitiveTopology primitive_topology);
127 
128 VkPipeline
129 zink_create_compute_pipeline(struct zink_screen *screen, struct zink_compute_program *comp, struct zink_compute_pipeline_state *state);
130 #endif
131