Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

anv_meta.c 61KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768
  1. /*
  2. * Copyright © 2015 Intel Corporation
  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. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * 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 NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21. * IN THE SOFTWARE.
  22. */
  23. #include <assert.h>
  24. #include <stdbool.h>
  25. #include <string.h>
  26. #include <unistd.h>
  27. #include <fcntl.h>
  28. #include "anv_private.h"
  29. #include "anv_nir_builder.h"
  30. static nir_shader *
  31. build_nir_vertex_shader(bool attr_flat)
  32. {
  33. nir_builder b;
  34. const struct glsl_type *vertex_type = glsl_vec4_type();
  35. nir_builder_init_simple_shader(&b, MESA_SHADER_VERTEX);
  36. nir_variable *pos_in = nir_variable_create(b.shader, "a_pos",
  37. vertex_type,
  38. nir_var_shader_in);
  39. pos_in->data.location = VERT_ATTRIB_GENERIC0;
  40. nir_variable *pos_out = nir_variable_create(b.shader, "gl_Position",
  41. vertex_type,
  42. nir_var_shader_out);
  43. pos_in->data.location = VARYING_SLOT_POS;
  44. nir_copy_var(&b, pos_out, pos_in);
  45. /* Add one more pass-through attribute. For clear shaders, this is used
  46. * to store the color and for blit shaders it's the texture coordinate.
  47. */
  48. const struct glsl_type *attr_type = glsl_vec4_type();
  49. nir_variable *attr_in = nir_variable_create(b.shader, "a_attr", attr_type,
  50. nir_var_shader_in);
  51. attr_in->data.location = VERT_ATTRIB_GENERIC1;
  52. nir_variable *attr_out = nir_variable_create(b.shader, "v_attr", attr_type,
  53. nir_var_shader_out);
  54. attr_out->data.location = VARYING_SLOT_VAR0;
  55. attr_out->data.interpolation = attr_flat ? INTERP_QUALIFIER_FLAT :
  56. INTERP_QUALIFIER_SMOOTH;
  57. nir_copy_var(&b, attr_out, attr_in);
  58. return b.shader;
  59. }
  60. static nir_shader *
  61. build_nir_clear_fragment_shader(void)
  62. {
  63. nir_builder b;
  64. const struct glsl_type *color_type = glsl_vec4_type();
  65. nir_builder_init_simple_shader(&b, MESA_SHADER_FRAGMENT);
  66. nir_variable *color_in = nir_variable_create(b.shader, "v_attr",
  67. color_type,
  68. nir_var_shader_in);
  69. color_in->data.location = VARYING_SLOT_VAR0;
  70. color_in->data.interpolation = INTERP_QUALIFIER_FLAT;
  71. nir_variable *color_out = nir_variable_create(b.shader, "f_color",
  72. color_type,
  73. nir_var_shader_out);
  74. color_out->data.location = FRAG_RESULT_DATA0;
  75. nir_copy_var(&b, color_out, color_in);
  76. return b.shader;
  77. }
  78. static nir_shader *
  79. build_nir_copy_fragment_shader(enum glsl_sampler_dim tex_dim)
  80. {
  81. nir_builder b;
  82. nir_builder_init_simple_shader(&b, MESA_SHADER_FRAGMENT);
  83. const struct glsl_type *color_type = glsl_vec4_type();
  84. nir_variable *tex_pos_in = nir_variable_create(b.shader, "v_attr",
  85. glsl_vec4_type(),
  86. nir_var_shader_in);
  87. tex_pos_in->data.location = VARYING_SLOT_VAR0;
  88. const struct glsl_type *sampler_type =
  89. glsl_sampler_type(tex_dim, false, false, glsl_get_base_type(color_type));
  90. nir_variable *sampler = nir_variable_create(b.shader, "s_tex", sampler_type,
  91. nir_var_uniform);
  92. sampler->data.descriptor_set = 0;
  93. sampler->data.binding = 0;
  94. nir_tex_instr *tex = nir_tex_instr_create(b.shader, 1);
  95. tex->sampler_dim = tex_dim;
  96. tex->op = nir_texop_tex;
  97. tex->src[0].src_type = nir_tex_src_coord;
  98. tex->src[0].src = nir_src_for_ssa(nir_load_var(&b, tex_pos_in));
  99. tex->dest_type = nir_type_float; /* TODO */
  100. switch (tex_dim) {
  101. case GLSL_SAMPLER_DIM_2D:
  102. tex->coord_components = 2;
  103. break;
  104. case GLSL_SAMPLER_DIM_3D:
  105. tex->coord_components = 3;
  106. break;
  107. default:
  108. assert(!"Unsupported texture dimension");
  109. }
  110. tex->sampler = nir_deref_var_create(tex, sampler);
  111. nir_ssa_dest_init(&tex->instr, &tex->dest, 4, "tex");
  112. nir_builder_instr_insert(&b, &tex->instr);
  113. nir_variable *color_out = nir_variable_create(b.shader, "f_color",
  114. color_type,
  115. nir_var_shader_out);
  116. color_out->data.location = FRAG_RESULT_DATA0;
  117. nir_store_var(&b, color_out, &tex->dest.ssa);
  118. return b.shader;
  119. }
  120. static void
  121. anv_device_init_meta_clear_state(struct anv_device *device)
  122. {
  123. struct anv_shader_module vsm = {
  124. .nir = build_nir_vertex_shader(true),
  125. };
  126. struct anv_shader_module fsm = {
  127. .nir = build_nir_clear_fragment_shader(),
  128. };
  129. VkShader vs;
  130. anv_CreateShader(anv_device_to_handle(device),
  131. &(VkShaderCreateInfo) {
  132. .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
  133. .module = anv_shader_module_to_handle(&vsm),
  134. .pName = "main",
  135. }, &vs);
  136. VkShader fs;
  137. anv_CreateShader(anv_device_to_handle(device),
  138. &(VkShaderCreateInfo) {
  139. .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
  140. .module = anv_shader_module_to_handle(&fsm),
  141. .pName = "main",
  142. }, &fs);
  143. /* We use instanced rendering to clear multiple render targets. We have two
  144. * vertex buffers: the first vertex buffer holds per-vertex data and
  145. * provides the vertices for the clear rectangle. The second one holds
  146. * per-instance data, which consists of the VUE header (which selects the
  147. * layer) and the color (Vulkan supports per-RT clear colors).
  148. */
  149. VkPipelineVertexInputStateCreateInfo vi_create_info = {
  150. .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
  151. .bindingCount = 2,
  152. .pVertexBindingDescriptions = (VkVertexInputBindingDescription[]) {
  153. {
  154. .binding = 0,
  155. .strideInBytes = 12,
  156. .stepRate = VK_VERTEX_INPUT_STEP_RATE_VERTEX
  157. },
  158. {
  159. .binding = 1,
  160. .strideInBytes = 32,
  161. .stepRate = VK_VERTEX_INPUT_STEP_RATE_INSTANCE
  162. },
  163. },
  164. .attributeCount = 3,
  165. .pVertexAttributeDescriptions = (VkVertexInputAttributeDescription[]) {
  166. {
  167. /* VUE Header */
  168. .location = 0,
  169. .binding = 1,
  170. .format = VK_FORMAT_R32G32B32A32_UINT,
  171. .offsetInBytes = 0
  172. },
  173. {
  174. /* Position */
  175. .location = 1,
  176. .binding = 0,
  177. .format = VK_FORMAT_R32G32B32_SFLOAT,
  178. .offsetInBytes = 0
  179. },
  180. {
  181. /* Color */
  182. .location = 2,
  183. .binding = 1,
  184. .format = VK_FORMAT_R32G32B32A32_SFLOAT,
  185. .offsetInBytes = 16
  186. }
  187. }
  188. };
  189. anv_graphics_pipeline_create(anv_device_to_handle(device),
  190. &(VkGraphicsPipelineCreateInfo) {
  191. .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
  192. .stageCount = 2,
  193. .pStages = (VkPipelineShaderStageCreateInfo[]) {
  194. {
  195. .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  196. .stage = VK_SHADER_STAGE_VERTEX,
  197. .shader = vs,
  198. .pSpecializationInfo = NULL
  199. }, {
  200. .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  201. .stage = VK_SHADER_STAGE_FRAGMENT,
  202. .shader = fs,
  203. .pSpecializationInfo = NULL,
  204. }
  205. },
  206. .pVertexInputState = &vi_create_info,
  207. .pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
  208. .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
  209. .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
  210. .primitiveRestartEnable = false,
  211. },
  212. .pRasterState = &(VkPipelineRasterStateCreateInfo) {
  213. .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO,
  214. .depthClipEnable = true,
  215. .rasterizerDiscardEnable = false,
  216. .fillMode = VK_FILL_MODE_SOLID,
  217. .cullMode = VK_CULL_MODE_NONE,
  218. .frontFace = VK_FRONT_FACE_CCW
  219. },
  220. .pDepthStencilState = &(VkPipelineDepthStencilStateCreateInfo) {
  221. .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
  222. .depthTestEnable = true,
  223. .depthWriteEnable = true,
  224. .depthCompareOp = VK_COMPARE_OP_ALWAYS,
  225. .depthBoundsTestEnable = false,
  226. .stencilTestEnable = true,
  227. .front = (VkStencilOpState) {
  228. .stencilPassOp = VK_STENCIL_OP_REPLACE,
  229. .stencilCompareOp = VK_COMPARE_OP_ALWAYS,
  230. },
  231. .back = (VkStencilOpState) {
  232. .stencilPassOp = VK_STENCIL_OP_REPLACE,
  233. .stencilCompareOp = VK_COMPARE_OP_ALWAYS,
  234. },
  235. },
  236. .pColorBlendState = &(VkPipelineColorBlendStateCreateInfo) {
  237. .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
  238. .attachmentCount = 1,
  239. .pAttachments = (VkPipelineColorBlendAttachmentState []) {
  240. { .channelWriteMask = VK_CHANNEL_A_BIT |
  241. VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
  242. }
  243. },
  244. .flags = 0,
  245. },
  246. &(struct anv_graphics_pipeline_create_info) {
  247. .use_repclear = true,
  248. .disable_viewport = true,
  249. .disable_vs = true,
  250. .use_rectlist = true
  251. },
  252. &device->meta_state.clear.pipeline);
  253. anv_DestroyShader(anv_device_to_handle(device), vs);
  254. anv_DestroyShader(anv_device_to_handle(device), fs);
  255. ralloc_free(vsm.nir);
  256. ralloc_free(fsm.nir);
  257. }
  258. #define NUM_VB_USED 2
  259. struct anv_saved_state {
  260. struct anv_vertex_binding old_vertex_bindings[NUM_VB_USED];
  261. struct anv_descriptor_set *old_descriptor_set0;
  262. struct anv_pipeline *old_pipeline;
  263. uint32_t dynamic_flags;
  264. struct anv_dynamic_state dynamic;
  265. };
  266. static void
  267. anv_cmd_buffer_save(struct anv_cmd_buffer *cmd_buffer,
  268. struct anv_saved_state *state,
  269. uint32_t dynamic_state)
  270. {
  271. state->old_pipeline = cmd_buffer->state.pipeline;
  272. state->old_descriptor_set0 = cmd_buffer->state.descriptors[0].set;
  273. memcpy(state->old_vertex_bindings, cmd_buffer->state.vertex_bindings,
  274. sizeof(state->old_vertex_bindings));
  275. state->dynamic_flags = dynamic_state;
  276. anv_dynamic_state_copy(&state->dynamic, &cmd_buffer->state.dynamic,
  277. dynamic_state);
  278. }
  279. static void
  280. anv_cmd_buffer_restore(struct anv_cmd_buffer *cmd_buffer,
  281. const struct anv_saved_state *state)
  282. {
  283. cmd_buffer->state.pipeline = state->old_pipeline;
  284. cmd_buffer->state.descriptors[0].set = state->old_descriptor_set0;
  285. memcpy(cmd_buffer->state.vertex_bindings, state->old_vertex_bindings,
  286. sizeof(state->old_vertex_bindings));
  287. cmd_buffer->state.vb_dirty |= (1 << NUM_VB_USED) - 1;
  288. cmd_buffer->state.dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY;
  289. cmd_buffer->state.descriptors_dirty |= VK_SHADER_STAGE_VERTEX_BIT;
  290. anv_dynamic_state_copy(&cmd_buffer->state.dynamic, &state->dynamic,
  291. state->dynamic_flags);
  292. cmd_buffer->state.dirty |= state->dynamic_flags;
  293. }
  294. struct vue_header {
  295. uint32_t Reserved;
  296. uint32_t RTAIndex;
  297. uint32_t ViewportIndex;
  298. float PointWidth;
  299. };
  300. struct clear_instance_data {
  301. struct vue_header vue_header;
  302. VkClearColorValue color;
  303. };
  304. static void
  305. meta_emit_clear(struct anv_cmd_buffer *cmd_buffer,
  306. int num_instances,
  307. struct clear_instance_data *instance_data,
  308. VkClearDepthStencilValue ds_clear_value)
  309. {
  310. struct anv_device *device = cmd_buffer->device;
  311. struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
  312. struct anv_state state;
  313. uint32_t size;
  314. const float vertex_data[] = {
  315. /* Rect-list coordinates */
  316. 0.0, 0.0, ds_clear_value.depth,
  317. fb->width, 0.0, ds_clear_value.depth,
  318. fb->width, fb->height, ds_clear_value.depth,
  319. /* Align to 16 bytes */
  320. 0.0, 0.0, 0.0,
  321. };
  322. size = sizeof(vertex_data) + num_instances * sizeof(*instance_data);
  323. state = anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, size, 16);
  324. /* Copy in the vertex and instance data */
  325. memcpy(state.map, vertex_data, sizeof(vertex_data));
  326. memcpy(state.map + sizeof(vertex_data), instance_data,
  327. num_instances * sizeof(*instance_data));
  328. struct anv_buffer vertex_buffer = {
  329. .device = cmd_buffer->device,
  330. .size = size,
  331. .bo = &device->dynamic_state_block_pool.bo,
  332. .offset = state.offset
  333. };
  334. anv_CmdBindVertexBuffers(anv_cmd_buffer_to_handle(cmd_buffer), 0, 2,
  335. (VkBuffer[]) {
  336. anv_buffer_to_handle(&vertex_buffer),
  337. anv_buffer_to_handle(&vertex_buffer)
  338. },
  339. (VkDeviceSize[]) {
  340. 0,
  341. sizeof(vertex_data)
  342. });
  343. if (cmd_buffer->state.pipeline != anv_pipeline_from_handle(device->meta_state.clear.pipeline))
  344. anv_CmdBindPipeline(anv_cmd_buffer_to_handle(cmd_buffer),
  345. VK_PIPELINE_BIND_POINT_GRAPHICS,
  346. device->meta_state.clear.pipeline);
  347. ANV_CALL(CmdDraw)(anv_cmd_buffer_to_handle(cmd_buffer),
  348. 3, num_instances, 0, 0);
  349. }
  350. void
  351. anv_cmd_buffer_clear_attachments(struct anv_cmd_buffer *cmd_buffer,
  352. struct anv_render_pass *pass,
  353. const VkClearValue *clear_values)
  354. {
  355. struct anv_saved_state saved_state;
  356. if (pass->has_stencil_clear_attachment)
  357. anv_finishme("stencil clear");
  358. /* FINISHME: Rethink how we count clear attachments in light of
  359. * 0.138.2 -> 0.170.2 diff.
  360. */
  361. if (pass->num_color_clear_attachments == 0 &&
  362. !pass->has_depth_clear_attachment)
  363. return;
  364. struct clear_instance_data instance_data[pass->num_color_clear_attachments];
  365. uint32_t color_attachments[pass->num_color_clear_attachments];
  366. uint32_t ds_attachment = VK_ATTACHMENT_UNUSED;
  367. VkClearDepthStencilValue ds_clear_value = {0};
  368. int layer = 0;
  369. for (uint32_t i = 0; i < pass->attachment_count; i++) {
  370. const struct anv_render_pass_attachment *att = &pass->attachments[i];
  371. if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
  372. if (anv_format_is_color(att->format)) {
  373. instance_data[layer] = (struct clear_instance_data) {
  374. .vue_header = {
  375. .RTAIndex = i,
  376. .ViewportIndex = 0,
  377. .PointWidth = 0.0
  378. },
  379. .color = clear_values[i].color,
  380. };
  381. color_attachments[layer] = i;
  382. layer++;
  383. } else if (att->format->depth_format) {
  384. assert(ds_attachment == VK_ATTACHMENT_UNUSED);
  385. ds_attachment = i;
  386. ds_clear_value = clear_values[ds_attachment].depthStencil;
  387. }
  388. } else if (att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
  389. assert(att->format->has_stencil);
  390. anv_finishme("stencil clear");
  391. }
  392. }
  393. anv_cmd_buffer_save(cmd_buffer, &saved_state,
  394. (1 << VK_DYNAMIC_STATE_VIEWPORT));
  395. cmd_buffer->state.dynamic.viewport.count = 0;
  396. struct anv_subpass subpass = {
  397. .input_count = 0,
  398. .color_count = pass->num_color_clear_attachments,
  399. .color_attachments = color_attachments,
  400. .depth_stencil_attachment = ds_attachment,
  401. };
  402. anv_cmd_buffer_begin_subpass(cmd_buffer, &subpass);
  403. meta_emit_clear(cmd_buffer, pass->num_color_clear_attachments,
  404. instance_data, ds_clear_value);
  405. /* Restore API state */
  406. anv_cmd_buffer_restore(cmd_buffer, &saved_state);
  407. }
  408. static VkImageViewType
  409. meta_blit_get_src_image_view_type(const struct anv_image *src_image)
  410. {
  411. switch (src_image->type) {
  412. case VK_IMAGE_TYPE_1D:
  413. return VK_IMAGE_VIEW_TYPE_1D;
  414. case VK_IMAGE_TYPE_2D:
  415. return VK_IMAGE_VIEW_TYPE_2D;
  416. case VK_IMAGE_TYPE_3D:
  417. return VK_IMAGE_VIEW_TYPE_3D;
  418. default:
  419. assert(!"bad VkImageType");
  420. return 0;
  421. }
  422. }
  423. static uint32_t
  424. meta_blit_get_dest_view_base_array_slice(const struct anv_image *dest_image,
  425. const VkImageSubresourceCopy *dest_subresource,
  426. const VkOffset3D *dest_offset)
  427. {
  428. switch (dest_image->type) {
  429. case VK_IMAGE_TYPE_1D:
  430. case VK_IMAGE_TYPE_2D:
  431. return dest_subresource->arrayLayer;
  432. case VK_IMAGE_TYPE_3D:
  433. /* HACK: Vulkan does not allow attaching a 3D image to a framebuffer,
  434. * but meta does it anyway. When doing so, we translate the
  435. * destination's z offset into an array offset.
  436. */
  437. return dest_offset->z;
  438. default:
  439. assert(!"bad VkImageType");
  440. return 0;
  441. }
  442. }
  443. static void
  444. anv_device_init_meta_blit_state(struct anv_device *device)
  445. {
  446. /* We don't use a vertex shader for clearing, but instead build and pass
  447. * the VUEs directly to the rasterization backend. However, we do need
  448. * to provide GLSL source for the vertex shader so that the compiler
  449. * does not dead-code our inputs.
  450. */
  451. struct anv_shader_module vsm = {
  452. .nir = build_nir_vertex_shader(false),
  453. };
  454. struct anv_shader_module fsm_2d = {
  455. .nir = build_nir_copy_fragment_shader(GLSL_SAMPLER_DIM_2D),
  456. };
  457. struct anv_shader_module fsm_3d = {
  458. .nir = build_nir_copy_fragment_shader(GLSL_SAMPLER_DIM_3D),
  459. };
  460. VkShader vs;
  461. anv_CreateShader(anv_device_to_handle(device),
  462. &(VkShaderCreateInfo) {
  463. .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
  464. .module = anv_shader_module_to_handle(&vsm),
  465. .pName = "main",
  466. }, &vs);
  467. VkShader fs_2d;
  468. anv_CreateShader(anv_device_to_handle(device),
  469. &(VkShaderCreateInfo) {
  470. .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
  471. .module = anv_shader_module_to_handle(&fsm_2d),
  472. .pName = "main",
  473. }, &fs_2d);
  474. VkShader fs_3d;
  475. anv_CreateShader(anv_device_to_handle(device),
  476. &(VkShaderCreateInfo) {
  477. .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
  478. .module = anv_shader_module_to_handle(&fsm_3d),
  479. .pName = "main",
  480. }, &fs_3d);
  481. VkPipelineVertexInputStateCreateInfo vi_create_info = {
  482. .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
  483. .bindingCount = 2,
  484. .pVertexBindingDescriptions = (VkVertexInputBindingDescription[]) {
  485. {
  486. .binding = 0,
  487. .strideInBytes = 0,
  488. .stepRate = VK_VERTEX_INPUT_STEP_RATE_VERTEX
  489. },
  490. {
  491. .binding = 1,
  492. .strideInBytes = 5 * sizeof(float),
  493. .stepRate = VK_VERTEX_INPUT_STEP_RATE_VERTEX
  494. },
  495. },
  496. .attributeCount = 3,
  497. .pVertexAttributeDescriptions = (VkVertexInputAttributeDescription[]) {
  498. {
  499. /* VUE Header */
  500. .location = 0,
  501. .binding = 0,
  502. .format = VK_FORMAT_R32G32B32A32_UINT,
  503. .offsetInBytes = 0
  504. },
  505. {
  506. /* Position */
  507. .location = 1,
  508. .binding = 1,
  509. .format = VK_FORMAT_R32G32_SFLOAT,
  510. .offsetInBytes = 0
  511. },
  512. {
  513. /* Texture Coordinate */
  514. .location = 2,
  515. .binding = 1,
  516. .format = VK_FORMAT_R32G32B32_SFLOAT,
  517. .offsetInBytes = 8
  518. }
  519. }
  520. };
  521. VkDescriptorSetLayoutCreateInfo ds_layout_info = {
  522. .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
  523. .count = 1,
  524. .pBinding = (VkDescriptorSetLayoutBinding[]) {
  525. {
  526. .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
  527. .arraySize = 1,
  528. .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
  529. .pImmutableSamplers = NULL
  530. },
  531. }
  532. };
  533. anv_CreateDescriptorSetLayout(anv_device_to_handle(device), &ds_layout_info,
  534. &device->meta_state.blit.ds_layout);
  535. anv_CreatePipelineLayout(anv_device_to_handle(device),
  536. &(VkPipelineLayoutCreateInfo) {
  537. .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
  538. .descriptorSetCount = 1,
  539. .pSetLayouts = &device->meta_state.blit.ds_layout,
  540. },
  541. &device->meta_state.blit.pipeline_layout);
  542. VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {
  543. {
  544. .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  545. .stage = VK_SHADER_STAGE_VERTEX,
  546. .shader = vs,
  547. .pSpecializationInfo = NULL
  548. }, {
  549. .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
  550. .stage = VK_SHADER_STAGE_FRAGMENT,
  551. .shader = {0}, /* TEMPLATE VALUE! FILL ME IN! */
  552. .pSpecializationInfo = NULL
  553. },
  554. };
  555. const VkGraphicsPipelineCreateInfo vk_pipeline_info = {
  556. .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
  557. .stageCount = ARRAY_SIZE(pipeline_shader_stages),
  558. .pStages = pipeline_shader_stages,
  559. .pVertexInputState = &vi_create_info,
  560. .pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
  561. .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
  562. .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
  563. .primitiveRestartEnable = false,
  564. },
  565. .pRasterState = &(VkPipelineRasterStateCreateInfo) {
  566. .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO,
  567. .depthClipEnable = true,
  568. .rasterizerDiscardEnable = false,
  569. .fillMode = VK_FILL_MODE_SOLID,
  570. .cullMode = VK_CULL_MODE_NONE,
  571. .frontFace = VK_FRONT_FACE_CCW
  572. },
  573. .pColorBlendState = &(VkPipelineColorBlendStateCreateInfo) {
  574. .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
  575. .attachmentCount = 1,
  576. .pAttachments = (VkPipelineColorBlendAttachmentState []) {
  577. { .channelWriteMask = VK_CHANNEL_A_BIT |
  578. VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
  579. }
  580. },
  581. .flags = 0,
  582. .layout = device->meta_state.blit.pipeline_layout,
  583. };
  584. const struct anv_graphics_pipeline_create_info anv_pipeline_info = {
  585. .use_repclear = false,
  586. .disable_viewport = true,
  587. .disable_scissor = true,
  588. .disable_vs = true,
  589. .use_rectlist = true
  590. };
  591. pipeline_shader_stages[1].shader = fs_2d;
  592. anv_graphics_pipeline_create(anv_device_to_handle(device),
  593. &vk_pipeline_info, &anv_pipeline_info,
  594. &device->meta_state.blit.pipeline_2d_src);
  595. pipeline_shader_stages[1].shader = fs_3d;
  596. anv_graphics_pipeline_create(anv_device_to_handle(device),
  597. &vk_pipeline_info, &anv_pipeline_info,
  598. &device->meta_state.blit.pipeline_3d_src);
  599. anv_DestroyShader(anv_device_to_handle(device), vs);
  600. anv_DestroyShader(anv_device_to_handle(device), fs_2d);
  601. anv_DestroyShader(anv_device_to_handle(device), fs_3d);
  602. ralloc_free(vsm.nir);
  603. ralloc_free(fsm_2d.nir);
  604. ralloc_free(fsm_3d.nir);
  605. }
  606. static void
  607. meta_prepare_blit(struct anv_cmd_buffer *cmd_buffer,
  608. struct anv_saved_state *saved_state)
  609. {
  610. anv_cmd_buffer_save(cmd_buffer, saved_state,
  611. (1 << VK_DYNAMIC_STATE_VIEWPORT));
  612. }
  613. struct blit_region {
  614. VkOffset3D src_offset;
  615. VkExtent3D src_extent;
  616. VkOffset3D dest_offset;
  617. VkExtent3D dest_extent;
  618. };
  619. static void
  620. meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
  621. struct anv_image *src_image,
  622. struct anv_image_view *src_iview,
  623. VkOffset3D src_offset,
  624. VkExtent3D src_extent,
  625. struct anv_image *dest_image,
  626. struct anv_image_view *dest_iview,
  627. VkOffset3D dest_offset,
  628. VkExtent3D dest_extent)
  629. {
  630. struct anv_device *device = cmd_buffer->device;
  631. VkDescriptorPool dummy_desc_pool = { .handle = 1 };
  632. struct blit_vb_data {
  633. float pos[2];
  634. float tex_coord[3];
  635. } *vb_data;
  636. unsigned vb_size = sizeof(struct vue_header) + 3 * sizeof(*vb_data);
  637. struct anv_state vb_state =
  638. anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, vb_size, 16);
  639. memset(vb_state.map, 0, sizeof(struct vue_header));
  640. vb_data = vb_state.map + sizeof(struct vue_header);
  641. vb_data[0] = (struct blit_vb_data) {
  642. .pos = {
  643. dest_offset.x + dest_extent.width,
  644. dest_offset.y + dest_extent.height,
  645. },
  646. .tex_coord = {
  647. (float)(src_offset.x + src_extent.width) / (float)src_iview->extent.width,
  648. (float)(src_offset.y + src_extent.height) / (float)src_iview->extent.height,
  649. (float)(src_offset.z + src_extent.depth) / (float)src_iview->extent.depth,
  650. },
  651. };
  652. vb_data[1] = (struct blit_vb_data) {
  653. .pos = {
  654. dest_offset.x,
  655. dest_offset.y + dest_extent.height,
  656. },
  657. .tex_coord = {
  658. (float)src_offset.x / (float)src_iview->extent.width,
  659. (float)(src_offset.y + src_extent.height) / (float)src_iview->extent.height,
  660. (float)(src_offset.z + src_extent.depth) / (float)src_iview->extent.depth,
  661. },
  662. };
  663. vb_data[2] = (struct blit_vb_data) {
  664. .pos = {
  665. dest_offset.x,
  666. dest_offset.y,
  667. },
  668. .tex_coord = {
  669. (float)src_offset.x / (float)src_iview->extent.width,
  670. (float)src_offset.y / (float)src_iview->extent.height,
  671. (float)src_offset.z / (float)src_iview->extent.depth,
  672. },
  673. };
  674. struct anv_buffer vertex_buffer = {
  675. .device = device,
  676. .size = vb_size,
  677. .bo = &device->dynamic_state_block_pool.bo,
  678. .offset = vb_state.offset,
  679. };
  680. anv_CmdBindVertexBuffers(anv_cmd_buffer_to_handle(cmd_buffer), 0, 2,
  681. (VkBuffer[]) {
  682. anv_buffer_to_handle(&vertex_buffer),
  683. anv_buffer_to_handle(&vertex_buffer)
  684. },
  685. (VkDeviceSize[]) {
  686. 0,
  687. sizeof(struct vue_header),
  688. });
  689. VkDescriptorSet set;
  690. anv_AllocDescriptorSets(anv_device_to_handle(device), dummy_desc_pool,
  691. VK_DESCRIPTOR_SET_USAGE_ONE_SHOT,
  692. 1, &device->meta_state.blit.ds_layout, &set);
  693. anv_UpdateDescriptorSets(anv_device_to_handle(device),
  694. 1, /* writeCount */
  695. (VkWriteDescriptorSet[]) {
  696. {
  697. .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
  698. .destSet = set,
  699. .destBinding = 0,
  700. .destArrayElement = 0,
  701. .count = 1,
  702. .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
  703. .pDescriptors = (VkDescriptorInfo[]) {
  704. {
  705. .imageView = anv_image_view_to_handle(src_iview),
  706. .imageLayout = VK_IMAGE_LAYOUT_GENERAL
  707. },
  708. }
  709. }
  710. }, 0, NULL);
  711. VkFramebuffer fb;
  712. anv_CreateFramebuffer(anv_device_to_handle(device),
  713. &(VkFramebufferCreateInfo) {
  714. .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
  715. .attachmentCount = 1,
  716. .pAttachments = (VkImageView[]) {
  717. anv_image_view_to_handle(dest_iview),
  718. },
  719. .width = dest_iview->extent.width,
  720. .height = dest_iview->extent.height,
  721. .layers = 1
  722. }, &fb);
  723. VkRenderPass pass;
  724. anv_CreateRenderPass(anv_device_to_handle(device),
  725. &(VkRenderPassCreateInfo) {
  726. .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
  727. .attachmentCount = 1,
  728. .pAttachments = &(VkAttachmentDescription) {
  729. .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION,
  730. .format = dest_iview->format->vk_format,
  731. .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
  732. .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
  733. .initialLayout = VK_IMAGE_LAYOUT_GENERAL,
  734. .finalLayout = VK_IMAGE_LAYOUT_GENERAL,
  735. },
  736. .subpassCount = 1,
  737. .pSubpasses = &(VkSubpassDescription) {
  738. .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION,
  739. .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
  740. .inputCount = 0,
  741. .colorCount = 1,
  742. .pColorAttachments = &(VkAttachmentReference) {
  743. .attachment = 0,
  744. .layout = VK_IMAGE_LAYOUT_GENERAL,
  745. },
  746. .pResolveAttachments = NULL,
  747. .depthStencilAttachment = (VkAttachmentReference) {
  748. .attachment = VK_ATTACHMENT_UNUSED,
  749. .layout = VK_IMAGE_LAYOUT_GENERAL,
  750. },
  751. .preserveCount = 1,
  752. .pPreserveAttachments = &(VkAttachmentReference) {
  753. .attachment = 0,
  754. .layout = VK_IMAGE_LAYOUT_GENERAL,
  755. },
  756. },
  757. .dependencyCount = 0,
  758. }, &pass);
  759. ANV_CALL(CmdBeginRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer),
  760. &(VkRenderPassBeginInfo) {
  761. .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
  762. .renderPass = pass,
  763. .framebuffer = fb,
  764. .renderArea = {
  765. .offset = { dest_offset.x, dest_offset.y },
  766. .extent = { dest_extent.width, dest_extent.height },
  767. },
  768. .clearValueCount = 0,
  769. .pClearValues = NULL,
  770. }, VK_RENDER_PASS_CONTENTS_INLINE);
  771. VkPipeline pipeline;
  772. switch (src_image->type) {
  773. case VK_IMAGE_TYPE_1D:
  774. anv_finishme("VK_IMAGE_TYPE_1D");
  775. pipeline = device->meta_state.blit.pipeline_2d_src;
  776. break;
  777. case VK_IMAGE_TYPE_2D:
  778. pipeline = device->meta_state.blit.pipeline_2d_src;
  779. break;
  780. case VK_IMAGE_TYPE_3D:
  781. pipeline = device->meta_state.blit.pipeline_3d_src;
  782. break;
  783. default:
  784. unreachable(!"bad VkImageType");
  785. }
  786. if (cmd_buffer->state.pipeline != anv_pipeline_from_handle(pipeline)) {
  787. anv_CmdBindPipeline(anv_cmd_buffer_to_handle(cmd_buffer),
  788. VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
  789. }
  790. anv_CmdSetViewport(anv_cmd_buffer_to_handle(cmd_buffer), 1,
  791. &(VkViewport) {
  792. .originX = 0.0f,
  793. .originY = 0.0f,
  794. .width = dest_iview->extent.width,
  795. .height = dest_iview->extent.height,
  796. .minDepth = 0.0f,
  797. .maxDepth = 1.0f,
  798. });
  799. anv_CmdBindDescriptorSets(anv_cmd_buffer_to_handle(cmd_buffer),
  800. VK_PIPELINE_BIND_POINT_GRAPHICS,
  801. device->meta_state.blit.pipeline_layout, 0, 1,
  802. &set, 0, NULL);
  803. ANV_CALL(CmdDraw)(anv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
  804. ANV_CALL(CmdEndRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer));
  805. /* At the point where we emit the draw call, all data from the
  806. * descriptor sets, etc. has been used. We are free to delete it.
  807. */
  808. anv_descriptor_set_destroy(device, anv_descriptor_set_from_handle(set));
  809. anv_DestroyFramebuffer(anv_device_to_handle(device), fb);
  810. anv_DestroyRenderPass(anv_device_to_handle(device), pass);
  811. }
  812. static void
  813. meta_finish_blit(struct anv_cmd_buffer *cmd_buffer,
  814. const struct anv_saved_state *saved_state)
  815. {
  816. anv_cmd_buffer_restore(cmd_buffer, saved_state);
  817. }
  818. static VkFormat
  819. vk_format_for_cpp(int cpp)
  820. {
  821. switch (cpp) {
  822. case 1: return VK_FORMAT_R8_UINT;
  823. case 2: return VK_FORMAT_R8G8_UINT;
  824. case 3: return VK_FORMAT_R8G8B8_UINT;
  825. case 4: return VK_FORMAT_R8G8B8A8_UINT;
  826. case 6: return VK_FORMAT_R16G16B16_UINT;
  827. case 8: return VK_FORMAT_R16G16B16A16_UINT;
  828. case 12: return VK_FORMAT_R32G32B32_UINT;
  829. case 16: return VK_FORMAT_R32G32B32A32_UINT;
  830. default:
  831. unreachable("Invalid format cpp");
  832. }
  833. }
  834. static void
  835. do_buffer_copy(struct anv_cmd_buffer *cmd_buffer,
  836. struct anv_bo *src, uint64_t src_offset,
  837. struct anv_bo *dest, uint64_t dest_offset,
  838. int width, int height, VkFormat copy_format)
  839. {
  840. VkDevice vk_device = anv_device_to_handle(cmd_buffer->device);
  841. VkImageCreateInfo image_info = {
  842. .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
  843. .imageType = VK_IMAGE_TYPE_2D,
  844. .format = copy_format,
  845. .extent = {
  846. .width = width,
  847. .height = height,
  848. .depth = 1,
  849. },
  850. .mipLevels = 1,
  851. .arraySize = 1,
  852. .samples = 1,
  853. .tiling = VK_IMAGE_TILING_LINEAR,
  854. .usage = 0,
  855. .flags = 0,
  856. };
  857. VkImage src_image;
  858. image_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
  859. anv_CreateImage(vk_device, &image_info, &src_image);
  860. VkImage dest_image;
  861. image_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
  862. anv_CreateImage(vk_device, &image_info, &dest_image);
  863. /* We could use a vk call to bind memory, but that would require
  864. * creating a dummy memory object etc. so there's really no point.
  865. */
  866. anv_image_from_handle(src_image)->bo = src;
  867. anv_image_from_handle(src_image)->offset = src_offset;
  868. anv_image_from_handle(dest_image)->bo = dest;
  869. anv_image_from_handle(dest_image)->offset = dest_offset;
  870. struct anv_image_view src_iview;
  871. anv_image_view_init(&src_iview, cmd_buffer->device,
  872. &(VkImageViewCreateInfo) {
  873. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  874. .image = src_image,
  875. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  876. .format = copy_format,
  877. .channels = {
  878. VK_CHANNEL_SWIZZLE_R,
  879. VK_CHANNEL_SWIZZLE_G,
  880. VK_CHANNEL_SWIZZLE_B,
  881. VK_CHANNEL_SWIZZLE_A
  882. },
  883. .subresourceRange = {
  884. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  885. .baseMipLevel = 0,
  886. .mipLevels = 1,
  887. .baseArrayLayer = 0,
  888. .arraySize = 1
  889. },
  890. },
  891. cmd_buffer);
  892. struct anv_image_view dest_iview;
  893. anv_image_view_init(&dest_iview, cmd_buffer->device,
  894. &(VkImageViewCreateInfo) {
  895. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  896. .image = dest_image,
  897. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  898. .format = copy_format,
  899. .channels = {
  900. .r = VK_CHANNEL_SWIZZLE_R,
  901. .g = VK_CHANNEL_SWIZZLE_G,
  902. .b = VK_CHANNEL_SWIZZLE_B,
  903. .a = VK_CHANNEL_SWIZZLE_A,
  904. },
  905. .subresourceRange = {
  906. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  907. .baseMipLevel = 0,
  908. .mipLevels = 1,
  909. .baseArrayLayer = 0,
  910. .arraySize = 1,
  911. },
  912. },
  913. cmd_buffer);
  914. meta_emit_blit(cmd_buffer,
  915. anv_image_from_handle(src_image),
  916. &src_iview,
  917. (VkOffset3D) { 0, 0, 0 },
  918. (VkExtent3D) { width, height, 1 },
  919. anv_image_from_handle(dest_image),
  920. &dest_iview,
  921. (VkOffset3D) { 0, 0, 0 },
  922. (VkExtent3D) { width, height, 1 });
  923. anv_DestroyImage(vk_device, src_image);
  924. anv_DestroyImage(vk_device, dest_image);
  925. }
  926. void anv_CmdCopyBuffer(
  927. VkCmdBuffer cmdBuffer,
  928. VkBuffer srcBuffer,
  929. VkBuffer destBuffer,
  930. uint32_t regionCount,
  931. const VkBufferCopy* pRegions)
  932. {
  933. ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
  934. ANV_FROM_HANDLE(anv_buffer, src_buffer, srcBuffer);
  935. ANV_FROM_HANDLE(anv_buffer, dest_buffer, destBuffer);
  936. struct anv_saved_state saved_state;
  937. meta_prepare_blit(cmd_buffer, &saved_state);
  938. for (unsigned r = 0; r < regionCount; r++) {
  939. uint64_t src_offset = src_buffer->offset + pRegions[r].srcOffset;
  940. uint64_t dest_offset = dest_buffer->offset + pRegions[r].destOffset;
  941. uint64_t copy_size = pRegions[r].copySize;
  942. /* First, we compute the biggest format that can be used with the
  943. * given offsets and size.
  944. */
  945. int cpp = 16;
  946. int fs = ffs(src_offset) - 1;
  947. if (fs != -1)
  948. cpp = MIN2(cpp, 1 << fs);
  949. assert(src_offset % cpp == 0);
  950. fs = ffs(dest_offset) - 1;
  951. if (fs != -1)
  952. cpp = MIN2(cpp, 1 << fs);
  953. assert(dest_offset % cpp == 0);
  954. fs = ffs(pRegions[r].copySize) - 1;
  955. if (fs != -1)
  956. cpp = MIN2(cpp, 1 << fs);
  957. assert(pRegions[r].copySize % cpp == 0);
  958. VkFormat copy_format = vk_format_for_cpp(cpp);
  959. /* This is maximum possible width/height our HW can handle */
  960. uint64_t max_surface_dim = 1 << 14;
  961. /* First, we make a bunch of max-sized copies */
  962. uint64_t max_copy_size = max_surface_dim * max_surface_dim * cpp;
  963. while (copy_size > max_copy_size) {
  964. do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
  965. dest_buffer->bo, dest_offset,
  966. max_surface_dim, max_surface_dim, copy_format);
  967. copy_size -= max_copy_size;
  968. src_offset += max_copy_size;
  969. dest_offset += max_copy_size;
  970. }
  971. uint64_t height = copy_size / (max_surface_dim * cpp);
  972. assert(height < max_surface_dim);
  973. if (height != 0) {
  974. uint64_t rect_copy_size = height * max_surface_dim * cpp;
  975. do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
  976. dest_buffer->bo, dest_offset,
  977. max_surface_dim, height, copy_format);
  978. copy_size -= rect_copy_size;
  979. src_offset += rect_copy_size;
  980. dest_offset += rect_copy_size;
  981. }
  982. if (copy_size != 0) {
  983. do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
  984. dest_buffer->bo, dest_offset,
  985. copy_size / cpp, 1, copy_format);
  986. }
  987. }
  988. meta_finish_blit(cmd_buffer, &saved_state);
  989. }
  990. void anv_CmdCopyImage(
  991. VkCmdBuffer cmdBuffer,
  992. VkImage srcImage,
  993. VkImageLayout srcImageLayout,
  994. VkImage destImage,
  995. VkImageLayout destImageLayout,
  996. uint32_t regionCount,
  997. const VkImageCopy* pRegions)
  998. {
  999. ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
  1000. ANV_FROM_HANDLE(anv_image, src_image, srcImage);
  1001. ANV_FROM_HANDLE(anv_image, dest_image, destImage);
  1002. const VkImageViewType src_iview_type =
  1003. meta_blit_get_src_image_view_type(src_image);
  1004. struct anv_saved_state saved_state;
  1005. meta_prepare_blit(cmd_buffer, &saved_state);
  1006. for (unsigned r = 0; r < regionCount; r++) {
  1007. struct anv_image_view src_iview;
  1008. anv_image_view_init(&src_iview, cmd_buffer->device,
  1009. &(VkImageViewCreateInfo) {
  1010. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1011. .image = srcImage,
  1012. .viewType = src_iview_type,
  1013. .format = src_image->format->vk_format,
  1014. .channels = {
  1015. VK_CHANNEL_SWIZZLE_R,
  1016. VK_CHANNEL_SWIZZLE_G,
  1017. VK_CHANNEL_SWIZZLE_B,
  1018. VK_CHANNEL_SWIZZLE_A
  1019. },
  1020. .subresourceRange = {
  1021. .aspectMask = 1 << pRegions[r].srcSubresource.aspect,
  1022. .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
  1023. .mipLevels = 1,
  1024. .baseArrayLayer = pRegions[r].srcSubresource.arrayLayer,
  1025. .arraySize = 1
  1026. },
  1027. },
  1028. cmd_buffer);
  1029. const VkOffset3D dest_offset = {
  1030. .x = pRegions[r].destOffset.x,
  1031. .y = pRegions[r].destOffset.y,
  1032. .z = 0,
  1033. };
  1034. const uint32_t dest_array_slice =
  1035. meta_blit_get_dest_view_base_array_slice(dest_image,
  1036. &pRegions[r].destSubresource,
  1037. &pRegions[r].destOffset);
  1038. if (pRegions[r].srcSubresource.arraySize > 1)
  1039. anv_finishme("FINISHME: copy multiple array layers");
  1040. if (pRegions[r].extent.depth > 1)
  1041. anv_finishme("FINISHME: copy multiple depth layers");
  1042. struct anv_image_view dest_iview;
  1043. anv_image_view_init(&dest_iview, cmd_buffer->device,
  1044. &(VkImageViewCreateInfo) {
  1045. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1046. .image = destImage,
  1047. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  1048. .format = dest_image->format->vk_format,
  1049. .channels = {
  1050. VK_CHANNEL_SWIZZLE_R,
  1051. VK_CHANNEL_SWIZZLE_G,
  1052. VK_CHANNEL_SWIZZLE_B,
  1053. VK_CHANNEL_SWIZZLE_A
  1054. },
  1055. .subresourceRange = {
  1056. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  1057. .baseMipLevel = pRegions[r].destSubresource.mipLevel,
  1058. .mipLevels = 1,
  1059. .baseArrayLayer = dest_array_slice,
  1060. .arraySize = 1
  1061. },
  1062. },
  1063. cmd_buffer);
  1064. meta_emit_blit(cmd_buffer,
  1065. src_image, &src_iview,
  1066. pRegions[r].srcOffset,
  1067. pRegions[r].extent,
  1068. dest_image, &dest_iview,
  1069. dest_offset,
  1070. pRegions[r].extent);
  1071. }
  1072. meta_finish_blit(cmd_buffer, &saved_state);
  1073. }
  1074. void anv_CmdBlitImage(
  1075. VkCmdBuffer cmdBuffer,
  1076. VkImage srcImage,
  1077. VkImageLayout srcImageLayout,
  1078. VkImage destImage,
  1079. VkImageLayout destImageLayout,
  1080. uint32_t regionCount,
  1081. const VkImageBlit* pRegions,
  1082. VkTexFilter filter)
  1083. {
  1084. ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
  1085. ANV_FROM_HANDLE(anv_image, src_image, srcImage);
  1086. ANV_FROM_HANDLE(anv_image, dest_image, destImage);
  1087. const VkImageViewType src_iview_type =
  1088. meta_blit_get_src_image_view_type(src_image);
  1089. struct anv_saved_state saved_state;
  1090. anv_finishme("respect VkTexFilter");
  1091. meta_prepare_blit(cmd_buffer, &saved_state);
  1092. for (unsigned r = 0; r < regionCount; r++) {
  1093. struct anv_image_view src_iview;
  1094. anv_image_view_init(&src_iview, cmd_buffer->device,
  1095. &(VkImageViewCreateInfo) {
  1096. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1097. .image = srcImage,
  1098. .viewType = src_iview_type,
  1099. .format = src_image->format->vk_format,
  1100. .channels = {
  1101. VK_CHANNEL_SWIZZLE_R,
  1102. VK_CHANNEL_SWIZZLE_G,
  1103. VK_CHANNEL_SWIZZLE_B,
  1104. VK_CHANNEL_SWIZZLE_A
  1105. },
  1106. .subresourceRange = {
  1107. .aspectMask = 1 << pRegions[r].srcSubresource.aspect,
  1108. .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
  1109. .mipLevels = 1,
  1110. .baseArrayLayer = pRegions[r].srcSubresource.arrayLayer,
  1111. .arraySize = 1
  1112. },
  1113. },
  1114. cmd_buffer);
  1115. const VkOffset3D dest_offset = {
  1116. .x = pRegions[r].destOffset.x,
  1117. .y = pRegions[r].destOffset.y,
  1118. .z = 0,
  1119. };
  1120. const uint32_t dest_array_slice =
  1121. meta_blit_get_dest_view_base_array_slice(dest_image,
  1122. &pRegions[r].destSubresource,
  1123. &pRegions[r].destOffset);
  1124. if (pRegions[r].srcSubresource.arraySize > 1)
  1125. anv_finishme("FINISHME: copy multiple array layers");
  1126. if (pRegions[r].destExtent.depth > 1)
  1127. anv_finishme("FINISHME: copy multiple depth layers");
  1128. struct anv_image_view dest_iview;
  1129. anv_image_view_init(&dest_iview, cmd_buffer->device,
  1130. &(VkImageViewCreateInfo) {
  1131. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1132. .image = destImage,
  1133. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  1134. .format = dest_image->format->vk_format,
  1135. .channels = {
  1136. VK_CHANNEL_SWIZZLE_R,
  1137. VK_CHANNEL_SWIZZLE_G,
  1138. VK_CHANNEL_SWIZZLE_B,
  1139. VK_CHANNEL_SWIZZLE_A
  1140. },
  1141. .subresourceRange = {
  1142. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  1143. .baseMipLevel = pRegions[r].destSubresource.mipLevel,
  1144. .mipLevels = 1,
  1145. .baseArrayLayer = dest_array_slice,
  1146. .arraySize = 1
  1147. },
  1148. },
  1149. cmd_buffer);
  1150. meta_emit_blit(cmd_buffer,
  1151. src_image, &src_iview,
  1152. pRegions[r].srcOffset,
  1153. pRegions[r].srcExtent,
  1154. dest_image, &dest_iview,
  1155. dest_offset,
  1156. pRegions[r].destExtent);
  1157. }
  1158. meta_finish_blit(cmd_buffer, &saved_state);
  1159. }
  1160. static VkImage
  1161. make_image_for_buffer(VkDevice vk_device, VkBuffer vk_buffer, VkFormat format,
  1162. VkImageUsageFlags usage,
  1163. const VkBufferImageCopy *copy)
  1164. {
  1165. ANV_FROM_HANDLE(anv_buffer, buffer, vk_buffer);
  1166. VkExtent3D extent = copy->imageExtent;
  1167. if (copy->bufferRowLength)
  1168. extent.width = copy->bufferRowLength;
  1169. if (copy->bufferImageHeight)
  1170. extent.height = copy->bufferImageHeight;
  1171. extent.depth = 1;
  1172. VkImage vk_image;
  1173. VkResult result = anv_CreateImage(vk_device,
  1174. &(VkImageCreateInfo) {
  1175. .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
  1176. .imageType = VK_IMAGE_TYPE_2D,
  1177. .format = format,
  1178. .extent = extent,
  1179. .mipLevels = 1,
  1180. .arraySize = 1,
  1181. .samples = 1,
  1182. .tiling = VK_IMAGE_TILING_LINEAR,
  1183. .usage = usage,
  1184. .flags = 0,
  1185. }, &vk_image);
  1186. assert(result == VK_SUCCESS);
  1187. ANV_FROM_HANDLE(anv_image, image, vk_image);
  1188. /* We could use a vk call to bind memory, but that would require
  1189. * creating a dummy memory object etc. so there's really no point.
  1190. */
  1191. image->bo = buffer->bo;
  1192. image->offset = buffer->offset + copy->bufferOffset;
  1193. return anv_image_to_handle(image);
  1194. }
  1195. void anv_CmdCopyBufferToImage(
  1196. VkCmdBuffer cmdBuffer,
  1197. VkBuffer srcBuffer,
  1198. VkImage destImage,
  1199. VkImageLayout destImageLayout,
  1200. uint32_t regionCount,
  1201. const VkBufferImageCopy* pRegions)
  1202. {
  1203. ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
  1204. ANV_FROM_HANDLE(anv_image, dest_image, destImage);
  1205. VkDevice vk_device = anv_device_to_handle(cmd_buffer->device);
  1206. const VkFormat orig_format = dest_image->format->vk_format;
  1207. struct anv_saved_state saved_state;
  1208. meta_prepare_blit(cmd_buffer, &saved_state);
  1209. for (unsigned r = 0; r < regionCount; r++) {
  1210. VkFormat proxy_format = orig_format;
  1211. VkImageAspect proxy_aspect = pRegions[r].imageSubresource.aspect;
  1212. if (orig_format == VK_FORMAT_S8_UINT) {
  1213. proxy_format = VK_FORMAT_R8_UINT;
  1214. proxy_aspect = VK_IMAGE_ASPECT_COLOR;
  1215. }
  1216. VkImage srcImage = make_image_for_buffer(vk_device, srcBuffer,
  1217. proxy_format, VK_IMAGE_USAGE_SAMPLED_BIT, &pRegions[r]);
  1218. struct anv_image_view src_iview;
  1219. anv_image_view_init(&src_iview, cmd_buffer->device,
  1220. &(VkImageViewCreateInfo) {
  1221. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1222. .image = srcImage,
  1223. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  1224. .format = proxy_format,
  1225. .channels = {
  1226. VK_CHANNEL_SWIZZLE_R,
  1227. VK_CHANNEL_SWIZZLE_G,
  1228. VK_CHANNEL_SWIZZLE_B,
  1229. VK_CHANNEL_SWIZZLE_A
  1230. },
  1231. .subresourceRange = {
  1232. .aspectMask = 1 << proxy_aspect,
  1233. .baseMipLevel = 0,
  1234. .mipLevels = 1,
  1235. .baseArrayLayer = 0,
  1236. .arraySize = 1
  1237. },
  1238. },
  1239. cmd_buffer);
  1240. const VkOffset3D dest_offset = {
  1241. .x = pRegions[r].imageOffset.x,
  1242. .y = pRegions[r].imageOffset.y,
  1243. .z = 0,
  1244. };
  1245. const uint32_t dest_array_slice =
  1246. meta_blit_get_dest_view_base_array_slice(dest_image,
  1247. &pRegions[r].imageSubresource,
  1248. &pRegions[r].imageOffset);
  1249. if (pRegions[r].imageExtent.depth > 1)
  1250. anv_finishme("FINISHME: copy multiple depth layers");
  1251. struct anv_image_view dest_iview;
  1252. anv_image_view_init(&dest_iview, cmd_buffer->device,
  1253. &(VkImageViewCreateInfo) {
  1254. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1255. .image = anv_image_to_handle(dest_image),
  1256. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  1257. .format = proxy_format,
  1258. .channels = {
  1259. VK_CHANNEL_SWIZZLE_R,
  1260. VK_CHANNEL_SWIZZLE_G,
  1261. VK_CHANNEL_SWIZZLE_B,
  1262. VK_CHANNEL_SWIZZLE_A
  1263. },
  1264. .subresourceRange = {
  1265. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  1266. .baseMipLevel = pRegions[r].imageSubresource.mipLevel,
  1267. .mipLevels = 1,
  1268. .baseArrayLayer = dest_array_slice,
  1269. .arraySize = 1
  1270. },
  1271. },
  1272. cmd_buffer);
  1273. meta_emit_blit(cmd_buffer,
  1274. anv_image_from_handle(srcImage),
  1275. &src_iview,
  1276. (VkOffset3D) { 0, 0, 0 },
  1277. pRegions[r].imageExtent,
  1278. dest_image,
  1279. &dest_iview,
  1280. dest_offset,
  1281. pRegions[r].imageExtent);
  1282. anv_DestroyImage(vk_device, srcImage);
  1283. }
  1284. meta_finish_blit(cmd_buffer, &saved_state);
  1285. }
  1286. void anv_CmdCopyImageToBuffer(
  1287. VkCmdBuffer cmdBuffer,
  1288. VkImage srcImage,
  1289. VkImageLayout srcImageLayout,
  1290. VkBuffer destBuffer,
  1291. uint32_t regionCount,
  1292. const VkBufferImageCopy* pRegions)
  1293. {
  1294. ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
  1295. ANV_FROM_HANDLE(anv_image, src_image, srcImage);
  1296. VkDevice vk_device = anv_device_to_handle(cmd_buffer->device);
  1297. struct anv_saved_state saved_state;
  1298. const VkImageViewType src_iview_type =
  1299. meta_blit_get_src_image_view_type(src_image);
  1300. meta_prepare_blit(cmd_buffer, &saved_state);
  1301. for (unsigned r = 0; r < regionCount; r++) {
  1302. if (pRegions[r].imageSubresource.arraySize > 1)
  1303. anv_finishme("FINISHME: copy multiple array layers");
  1304. if (pRegions[r].imageExtent.depth > 1)
  1305. anv_finishme("FINISHME: copy multiple depth layers");
  1306. struct anv_image_view src_iview;
  1307. anv_image_view_init(&src_iview, cmd_buffer->device,
  1308. &(VkImageViewCreateInfo) {
  1309. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1310. .image = srcImage,
  1311. .viewType = src_iview_type,
  1312. .format = src_image->format->vk_format,
  1313. .channels = {
  1314. VK_CHANNEL_SWIZZLE_R,
  1315. VK_CHANNEL_SWIZZLE_G,
  1316. VK_CHANNEL_SWIZZLE_B,
  1317. VK_CHANNEL_SWIZZLE_A
  1318. },
  1319. .subresourceRange = {
  1320. .aspectMask = 1 << pRegions[r].imageSubresource.aspect,
  1321. .baseMipLevel = pRegions[r].imageSubresource.mipLevel,
  1322. .mipLevels = 1,
  1323. .baseArrayLayer = pRegions[r].imageSubresource.arrayLayer,
  1324. .arraySize = 1
  1325. },
  1326. },
  1327. cmd_buffer);
  1328. VkFormat dest_format = src_image->format->vk_format;
  1329. if (dest_format == VK_FORMAT_S8_UINT) {
  1330. dest_format = VK_FORMAT_R8_UINT;
  1331. }
  1332. VkImage destImage = make_image_for_buffer(vk_device, destBuffer,
  1333. dest_format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, &pRegions[r]);
  1334. struct anv_image_view dest_iview;
  1335. anv_image_view_init(&dest_iview, cmd_buffer->device,
  1336. &(VkImageViewCreateInfo) {
  1337. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1338. .image = destImage,
  1339. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  1340. .format = dest_format,
  1341. .channels = {
  1342. VK_CHANNEL_SWIZZLE_R,
  1343. VK_CHANNEL_SWIZZLE_G,
  1344. VK_CHANNEL_SWIZZLE_B,
  1345. VK_CHANNEL_SWIZZLE_A
  1346. },
  1347. .subresourceRange = {
  1348. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  1349. .baseMipLevel = 0,
  1350. .mipLevels = 1,
  1351. .baseArrayLayer = 0,
  1352. .arraySize = 1
  1353. },
  1354. },
  1355. cmd_buffer);
  1356. meta_emit_blit(cmd_buffer,
  1357. anv_image_from_handle(srcImage),
  1358. &src_iview,
  1359. pRegions[r].imageOffset,
  1360. pRegions[r].imageExtent,
  1361. anv_image_from_handle(destImage),
  1362. &dest_iview,
  1363. (VkOffset3D) { 0, 0, 0 },
  1364. pRegions[r].imageExtent);
  1365. anv_DestroyImage(vk_device, destImage);
  1366. }
  1367. meta_finish_blit(cmd_buffer, &saved_state);
  1368. }
  1369. void anv_CmdUpdateBuffer(
  1370. VkCmdBuffer cmdBuffer,
  1371. VkBuffer destBuffer,
  1372. VkDeviceSize destOffset,
  1373. VkDeviceSize dataSize,
  1374. const uint32_t* pData)
  1375. {
  1376. stub();
  1377. }
  1378. void anv_CmdFillBuffer(
  1379. VkCmdBuffer cmdBuffer,
  1380. VkBuffer destBuffer,
  1381. VkDeviceSize destOffset,
  1382. VkDeviceSize fillSize,
  1383. uint32_t data)
  1384. {
  1385. stub();
  1386. }
  1387. void anv_CmdClearColorImage(
  1388. VkCmdBuffer cmdBuffer,
  1389. VkImage _image,
  1390. VkImageLayout imageLayout,
  1391. const VkClearColorValue* pColor,
  1392. uint32_t rangeCount,
  1393. const VkImageSubresourceRange* pRanges)
  1394. {
  1395. ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
  1396. ANV_FROM_HANDLE(anv_image, image, _image);
  1397. struct anv_saved_state saved_state;
  1398. anv_cmd_buffer_save(cmd_buffer, &saved_state,
  1399. (1 << VK_DYNAMIC_STATE_VIEWPORT));
  1400. cmd_buffer->state.dynamic.viewport.count = 0;
  1401. for (uint32_t r = 0; r < rangeCount; r++) {
  1402. for (uint32_t l = 0; l < pRanges[r].mipLevels; l++) {
  1403. for (uint32_t s = 0; s < pRanges[r].arraySize; s++) {
  1404. struct anv_image_view iview;
  1405. anv_image_view_init(&iview, cmd_buffer->device,
  1406. &(VkImageViewCreateInfo) {
  1407. .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
  1408. .image = _image,
  1409. .viewType = VK_IMAGE_VIEW_TYPE_2D,
  1410. .format = image->format->vk_format,
  1411. .channels = {
  1412. VK_CHANNEL_SWIZZLE_R,
  1413. VK_CHANNEL_SWIZZLE_G,
  1414. VK_CHANNEL_SWIZZLE_B,
  1415. VK_CHANNEL_SWIZZLE_A
  1416. },
  1417. .subresourceRange = {
  1418. .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
  1419. .baseMipLevel = pRanges[r].baseMipLevel + l,
  1420. .mipLevels = 1,
  1421. .baseArrayLayer = pRanges[r].baseArrayLayer + s,
  1422. .arraySize = 1
  1423. },
  1424. },
  1425. cmd_buffer);
  1426. VkFramebuffer fb;
  1427. anv_CreateFramebuffer(anv_device_to_handle(cmd_buffer->device),
  1428. &(VkFramebufferCreateInfo) {
  1429. .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
  1430. .attachmentCount = 1,
  1431. .pAttachments = (VkImageView[]) {
  1432. anv_image_view_to_handle(&iview),
  1433. },
  1434. .width = iview.extent.width,
  1435. .height = iview.extent.height,
  1436. .layers = 1
  1437. }, &fb);
  1438. VkRenderPass pass;
  1439. anv_CreateRenderPass(anv_device_to_handle(cmd_buffer->device),
  1440. &(VkRenderPassCreateInfo) {
  1441. .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
  1442. .attachmentCount = 1,
  1443. .pAttachments = &(VkAttachmentDescription) {
  1444. .sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION,
  1445. .format = iview.format->vk_format,
  1446. .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
  1447. .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
  1448. .initialLayout = VK_IMAGE_LAYOUT_GENERAL,
  1449. .finalLayout = VK_IMAGE_LAYOUT_GENERAL,
  1450. },
  1451. .subpassCount = 1,
  1452. .pSubpasses = &(VkSubpassDescription) {
  1453. .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION,
  1454. .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
  1455. .inputCount = 0,
  1456. .colorCount = 1,
  1457. .pColorAttachments = &(VkAttachmentReference) {
  1458. .attachment = 0,
  1459. .layout = VK_IMAGE_LAYOUT_GENERAL,
  1460. },
  1461. .pResolveAttachments = NULL,
  1462. .depthStencilAttachment = (VkAttachmentReference) {
  1463. .attachment = VK_ATTACHMENT_UNUSED,
  1464. .layout = VK_IMAGE_LAYOUT_GENERAL,
  1465. },
  1466. .preserveCount = 1,
  1467. .pPreserveAttachments = &(VkAttachmentReference) {
  1468. .attachment = 0,
  1469. .layout = VK_IMAGE_LAYOUT_GENERAL,
  1470. },
  1471. },
  1472. .dependencyCount = 0,
  1473. }, &pass);
  1474. ANV_CALL(CmdBeginRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer),
  1475. &(VkRenderPassBeginInfo) {
  1476. .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
  1477. .renderArea = {
  1478. .offset = { 0, 0, },
  1479. .extent = {
  1480. .width = iview.extent.width,
  1481. .height = iview.extent.height,
  1482. },
  1483. },
  1484. .renderPass = pass,
  1485. .framebuffer = fb,
  1486. .clearValueCount = 1,
  1487. .pClearValues = NULL,
  1488. }, VK_RENDER_PASS_CONTENTS_INLINE);
  1489. struct clear_instance_data instance_data = {
  1490. .vue_header = {
  1491. .RTAIndex = 0,
  1492. .ViewportIndex = 0,
  1493. .PointWidth = 0.0
  1494. },
  1495. .color = *pColor,
  1496. };
  1497. meta_emit_clear(cmd_buffer, 1, &instance_data,
  1498. (VkClearDepthStencilValue) {0});
  1499. ANV_CALL(CmdEndRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer));
  1500. }
  1501. }
  1502. }
  1503. /* Restore API state */
  1504. anv_cmd_buffer_restore(cmd_buffer, &saved_state);
  1505. }
  1506. void anv_CmdClearDepthStencilImage(
  1507. VkCmdBuffer cmdBuffer,
  1508. VkImage image,
  1509. VkImageLayout imageLayout,
  1510. const VkClearDepthStencilValue* pDepthStencil,
  1511. uint32_t rangeCount,
  1512. const VkImageSubresourceRange* pRanges)
  1513. {
  1514. stub();
  1515. }
  1516. void anv_CmdClearColorAttachment(
  1517. VkCmdBuffer cmdBuffer,
  1518. uint32_t colorAttachment,
  1519. VkImageLayout imageLayout,
  1520. const VkClearColorValue* pColor,
  1521. uint32_t rectCount,
  1522. const VkRect3D* pRects)
  1523. {
  1524. stub();
  1525. }
  1526. void anv_CmdClearDepthStencilAttachment(
  1527. VkCmdBuffer cmdBuffer,
  1528. VkImageAspectFlags aspectMask,
  1529. VkImageLayout imageLayout,
  1530. const VkClearDepthStencilValue* pDepthStencil,
  1531. uint32_t rectCount,
  1532. const VkRect3D* pRects)
  1533. {
  1534. stub();
  1535. }
  1536. void anv_CmdResolveImage(
  1537. VkCmdBuffer cmdBuffer,
  1538. VkImage srcImage,
  1539. VkImageLayout srcImageLayout,
  1540. VkImage destImage,
  1541. VkImageLayout destImageLayout,
  1542. uint32_t regionCount,
  1543. const VkImageResolve* pRegions)
  1544. {
  1545. stub();
  1546. }
  1547. void
  1548. anv_device_init_meta(struct anv_device *device)
  1549. {
  1550. anv_device_init_meta_clear_state(device);
  1551. anv_device_init_meta_blit_state(device);
  1552. }
  1553. void
  1554. anv_device_finish_meta(struct anv_device *device)
  1555. {
  1556. /* Clear */
  1557. anv_DestroyPipeline(anv_device_to_handle(device),
  1558. device->meta_state.clear.pipeline);
  1559. /* Blit */
  1560. anv_DestroyPipeline(anv_device_to_handle(device),
  1561. device->meta_state.blit.pipeline_2d_src);
  1562. anv_DestroyPipeline(anv_device_to_handle(device),
  1563. device->meta_state.blit.pipeline_3d_src);
  1564. anv_DestroyPipelineLayout(anv_device_to_handle(device),
  1565. device->meta_state.blit.pipeline_layout);
  1566. anv_DestroyDescriptorSetLayout(anv_device_to_handle(device),
  1567. device->meta_state.blit.ds_layout);
  1568. }