blob: d7aafde58e6356b3621bfc2f638c7e92619896ba [file] [log] [blame]
Chia-I Wu525c6602014-08-27 10:22:34 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the 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
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Chia-I Wu44e42362014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
Chia-I Wu525c6602014-08-27 10:22:34 +080026 */
27
28#include "genhw/genhw.h"
29#include "img.h"
Chia-I Wu714df452015-01-01 07:55:04 +080030#include "buf.h"
Chia-I Wu525c6602014-08-27 10:22:34 +080031#include "cmd_priv.h"
32
33enum {
34 MEM_CACHE = 1 << 0,
35 DATA_READ_CACHE = 1 << 1,
36 DATA_WRITE_CACHE = 1 << 2,
37 RENDER_CACHE = 1 << 3,
38 SAMPLER_CACHE = 1 << 4,
39};
40
Chia-I Wu714df452015-01-01 07:55:04 +080041static uint32_t buf_get_state_caches(const struct intel_buf *buf,
42 XGL_BUFFER_STATE state)
Chia-I Wu525c6602014-08-27 10:22:34 +080043{
44 uint32_t caches;
45
46 switch (state) {
Chia-I Wu714df452015-01-01 07:55:04 +080047 case XGL_BUFFER_STATE_DATA_TRANSFER:
Chia-I Wub5c1cdf2014-11-22 03:17:45 +080048 /*
49 * because of meta, this may imply GPU render/sample in addition to
50 * CPU read/write
51 */
52 caches = MEM_CACHE | RENDER_CACHE | SAMPLER_CACHE;
53 break;
Chia-I Wu714df452015-01-01 07:55:04 +080054 case XGL_BUFFER_STATE_INDEX_DATA:
55 case XGL_BUFFER_STATE_INDIRECT_ARG:
56 case XGL_BUFFER_STATE_WRITE_TIMESTAMP:
57 case XGL_BUFFER_STATE_QUEUE_ATOMIC:
Chia-I Wu525c6602014-08-27 10:22:34 +080058 caches = MEM_CACHE;
59 break;
Chia-I Wu714df452015-01-01 07:55:04 +080060 case XGL_BUFFER_STATE_GRAPHICS_SHADER_READ_ONLY:
61 case XGL_BUFFER_STATE_COMPUTE_SHADER_READ_ONLY:
62 case XGL_BUFFER_STATE_MULTI_SHADER_READ_ONLY:
Chia-I Wu525c6602014-08-27 10:22:34 +080063 caches = DATA_READ_CACHE;
64 break;
Chia-I Wu714df452015-01-01 07:55:04 +080065 case XGL_BUFFER_STATE_GRAPHICS_SHADER_WRITE_ONLY:
66 case XGL_BUFFER_STATE_COMPUTE_SHADER_WRITE_ONLY:
Chia-I Wu525c6602014-08-27 10:22:34 +080067 caches = DATA_WRITE_CACHE;
68 break;
Chia-I Wu714df452015-01-01 07:55:04 +080069 case XGL_BUFFER_STATE_GRAPHICS_SHADER_READ_WRITE:
70 case XGL_BUFFER_STATE_COMPUTE_SHADER_READ_WRITE:
Chia-I Wu525c6602014-08-27 10:22:34 +080071 caches = DATA_READ_CACHE | DATA_WRITE_CACHE;
72 break;
73 default:
74 caches = 0;
75 break;
76 }
77
78 return caches;
79}
80
Chia-I Wu525c6602014-08-27 10:22:34 +080081static uint32_t img_get_state_caches(const struct intel_img *img,
82 XGL_IMAGE_STATE state)
83{
84 uint32_t caches;
85
86 switch (state) {
87 case XGL_IMAGE_STATE_DATA_TRANSFER:
Chia-I Wu714df452015-01-01 07:55:04 +080088 /* as in XGL_BUFFER_STATE_DATA_TRANSFER */
Chia-I Wub5c1cdf2014-11-22 03:17:45 +080089 caches = MEM_CACHE | RENDER_CACHE | SAMPLER_CACHE;
Chia-I Wu525c6602014-08-27 10:22:34 +080090 break;
91 case XGL_IMAGE_STATE_GRAPHICS_SHADER_WRITE_ONLY:
92 case XGL_IMAGE_STATE_COMPUTE_SHADER_WRITE_ONLY:
93 caches = DATA_WRITE_CACHE;
94 break;
95 case XGL_IMAGE_STATE_GRAPHICS_SHADER_READ_ONLY:
96 case XGL_IMAGE_STATE_MULTI_SHADER_READ_ONLY:
97 case XGL_IMAGE_STATE_TARGET_AND_SHADER_READ_ONLY:
98 caches = DATA_READ_CACHE | SAMPLER_CACHE;
99 break;
100 case XGL_IMAGE_STATE_COMPUTE_SHADER_READ_ONLY:
101 caches = DATA_READ_CACHE;
102 break;
103 case XGL_IMAGE_STATE_GRAPHICS_SHADER_READ_WRITE:
104 caches = DATA_READ_CACHE | DATA_WRITE_CACHE | SAMPLER_CACHE;
105 break;
106 case XGL_IMAGE_STATE_COMPUTE_SHADER_READ_WRITE:
107 caches = DATA_READ_CACHE | DATA_WRITE_CACHE;
108 break;
109 case XGL_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL:
110 case XGL_IMAGE_STATE_TARGET_SHADER_ACCESS_OPTIMAL:
111 caches = RENDER_CACHE | DATA_WRITE_CACHE;
112 break;
113 case XGL_IMAGE_STATE_CLEAR:
114 case XGL_IMAGE_STATE_RESOLVE_DESTINATION:
115 caches = RENDER_CACHE;
116 break;
117 case XGL_IMAGE_STATE_RESOLVE_SOURCE:
118 caches = SAMPLER_CACHE;
119 break;
120 default:
121 caches = 0;
122 break;
123 }
124
125 return caches;
126}
127
Chia-I Wub5c1cdf2014-11-22 03:17:45 +0800128static uint32_t cmd_get_flush_flags(const struct intel_cmd *cmd,
129 uint32_t old_caches,
130 uint32_t new_caches,
131 bool is_ds)
Chia-I Wu525c6602014-08-27 10:22:34 +0800132{
133 uint32_t flags = 0;
134
135 /* not dirty */
136 if (!(old_caches & (MEM_CACHE | RENDER_CACHE | DATA_WRITE_CACHE)))
137 return 0;
138
139 if ((old_caches & RENDER_CACHE) && (new_caches & ~RENDER_CACHE)) {
Chia-I Wub5c1cdf2014-11-22 03:17:45 +0800140 if (is_ds)
Chia-I Wu525c6602014-08-27 10:22:34 +0800141 flags |= GEN6_PIPE_CONTROL_DEPTH_CACHE_FLUSH;
142 else
143 flags |= GEN6_PIPE_CONTROL_RENDER_CACHE_FLUSH;
144 }
145
146 if ((old_caches & DATA_WRITE_CACHE) &&
147 (new_caches & ~(DATA_READ_CACHE | DATA_WRITE_CACHE))) {
148 if (cmd_gen(cmd) >= INTEL_GEN(7))
149 flags |= GEN7_PIPE_CONTROL_DC_FLUSH_ENABLE;
150 }
151
152 if (new_caches & SAMPLER_CACHE)
153 flags |= GEN6_PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
154
155 if ((new_caches & DATA_READ_CACHE) && old_caches != DATA_WRITE_CACHE)
156 flags |= GEN6_PIPE_CONTROL_CONSTANT_CACHE_INVALIDATE;
157
158 if (!flags)
159 return 0;
160
161 flags |= GEN6_PIPE_CONTROL_CS_STALL;
162
163 return flags;
164}
165
Chia-I Wu714df452015-01-01 07:55:04 +0800166ICD_EXPORT XGL_VOID XGLAPI xglCmdPrepareBufferRegions(
Chia-I Wu525c6602014-08-27 10:22:34 +0800167 XGL_CMD_BUFFER cmdBuffer,
168 XGL_UINT transitionCount,
Chia-I Wu714df452015-01-01 07:55:04 +0800169 const XGL_BUFFER_STATE_TRANSITION* pStateTransitions)
Chia-I Wu525c6602014-08-27 10:22:34 +0800170{
171 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
172 uint32_t flush_flags = 0;
173 XGL_UINT i;
174
175 for (i = 0; i < transitionCount; i++) {
Chia-I Wu714df452015-01-01 07:55:04 +0800176 const XGL_BUFFER_STATE_TRANSITION *trans = &pStateTransitions[i];
177 struct intel_buf *buf = intel_buf(trans->buffer);
Chia-I Wu525c6602014-08-27 10:22:34 +0800178
Chia-I Wub5c1cdf2014-11-22 03:17:45 +0800179 flush_flags |= cmd_get_flush_flags(cmd,
Chia-I Wu714df452015-01-01 07:55:04 +0800180 buf_get_state_caches(buf, trans->oldState),
181 buf_get_state_caches(buf, trans->newState),
Chia-I Wub5c1cdf2014-11-22 03:17:45 +0800182 false);
Chia-I Wu525c6602014-08-27 10:22:34 +0800183 }
184
185 cmd_batch_flush(cmd, flush_flags);
186}
187
Chia-I Wu96177272015-01-03 15:27:41 +0800188ICD_EXPORT XGL_VOID XGLAPI xglCmdPrepareImages(
Chia-I Wu525c6602014-08-27 10:22:34 +0800189 XGL_CMD_BUFFER cmdBuffer,
190 XGL_UINT transitionCount,
191 const XGL_IMAGE_STATE_TRANSITION* pStateTransitions)
192{
193 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
194 uint32_t flush_flags = 0;
195 XGL_UINT i;
196
197 for (i = 0; i < transitionCount; i++) {
198 const XGL_IMAGE_STATE_TRANSITION *trans = &pStateTransitions[i];
199 struct intel_img *img = intel_img(trans->image);
200
Chia-I Wub5c1cdf2014-11-22 03:17:45 +0800201 flush_flags |= cmd_get_flush_flags(cmd,
Chia-I Wu525c6602014-08-27 10:22:34 +0800202 img_get_state_caches(img, trans->oldState),
Chia-I Wub5c1cdf2014-11-22 03:17:45 +0800203 img_get_state_caches(img, trans->newState),
204 (img->layout.format.numericFormat == XGL_NUM_FMT_DS));
Chia-I Wu525c6602014-08-27 10:22:34 +0800205 }
206
207 cmd_batch_flush(cmd, flush_flags);
208}