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_RENDERPASS_H 25 #define ZINK_RENDERPASS_H 26 27 #include <vulkan/vulkan.h> 28 29 #include "pipe/p_state.h" 30 #include "util/u_inlines.h" 31 32 struct zink_screen; 33 34 struct zink_rt_attrib { 35 VkFormat format; 36 VkSampleCountFlagBits samples; 37 bool clear_color; 38 union { 39 bool clear_stencil; 40 bool fbfetch; 41 }; 42 union { 43 bool invalid; 44 bool needs_write; 45 }; 46 bool resolve; 47 bool mixed_zs; 48 }; 49 50 struct zink_render_pass_state { 51 union { 52 struct { 53 uint8_t num_cbufs : 5; /* PIPE_MAX_COLOR_BUFS = 8 */ 54 uint8_t have_zsbuf : 1; 55 uint8_t samples:1; //for fs samplemask 56 uint32_t num_zsresolves : 1; 57 uint32_t num_cresolves : 24; /* PIPE_MAX_COLOR_BUFS, but this is a struct hole */ 58 }; 59 uint32_t val; //for comparison 60 }; 61 struct zink_rt_attrib rts[PIPE_MAX_COLOR_BUFS + 1]; 62 unsigned num_rts; 63 uint32_t clears; //for extra verification and update flagging 64 uint32_t msaa_expand_mask; 65 }; 66 67 struct zink_pipeline_rt { 68 VkFormat format; 69 VkSampleCountFlagBits samples; 70 }; 71 72 struct zink_render_pass_pipeline_state { 73 uint32_t num_attachments:22; 74 uint32_t fbfetch:1; 75 uint32_t color_read:1; 76 uint32_t depth_read:1; 77 uint32_t depth_write:1; 78 uint32_t num_cresolves:4; 79 uint32_t num_zsresolves:1; 80 bool samples:1; //for fs samplemask 81 struct zink_pipeline_rt attachments[PIPE_MAX_COLOR_BUFS + 1]; 82 unsigned id; 83 }; 84 85 struct zink_render_pass { 86 VkRenderPass render_pass; 87 struct zink_render_pass_state state; 88 unsigned pipeline_state; 89 }; 90 91 struct zink_render_pass * 92 zink_create_render_pass(struct zink_screen *screen, 93 struct zink_render_pass_state *state, 94 struct zink_render_pass_pipeline_state *pstate); 95 96 void 97 zink_destroy_render_pass(struct zink_screen *screen, 98 struct zink_render_pass *rp); 99 100 101 unsigned 102 zink_begin_render_pass(struct zink_context *ctx); 103 void 104 zink_end_render_pass(struct zink_context *ctx); 105 106 VkImageLayout 107 zink_render_pass_attachment_get_barrier_info(const struct zink_rt_attrib *rt, bool color, VkPipelineStageFlags *pipeline, VkAccessFlags *access); 108 109 bool 110 zink_init_render_pass(struct zink_context *ctx); 111 void 112 zink_render_update_swapchain(struct zink_context *ctx); 113 void 114 zink_init_zs_attachment(struct zink_context *ctx, struct zink_rt_attrib *rt); 115 void 116 zink_init_color_attachment(struct zink_context *ctx, unsigned i, struct zink_rt_attrib *rt); 117 #endif 118