From 1a0d5030f9f0511112ebfa89b2cc161bc2ee7e4d Mon Sep 17 00:00:00 2001 From: twinaphex <libretro@gmail.com> Date: Sat, 19 Jan 2019 23:02:48 +0100 Subject: [PATCH] shader_vulkan.cpp - doesn't need math.h --- gfx/drivers_shader/shader_vulkan.cpp | 196 +++++++++++++++------------ 1 file changed, 106 insertions(+), 90 deletions(-) diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index c674994534..97fca27faf 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -22,7 +22,6 @@ #include <utility> #include <algorithm> #include <string.h> -#include <math.h> #include <compat/strl.h> #include <formats/image.h> @@ -473,12 +472,12 @@ class Pass struct PushConstant { VkShaderStageFlags stages = 0; - vector<uint32_t> buffer; // uint32_t to have correct alignment. + vector<uint32_t> buffer; /* uint32_t to have correct alignment. */ }; PushConstant push; }; -// struct here since we're implementing the opaque typedef from C. +/* struct here since we're implementing the opaque typedef from C. */ struct vulkan_filter_chain { public: @@ -750,7 +749,8 @@ bool vulkan_filter_chain::init_history() return true; } - // We don't need to store array element #0, since it's aliased with the actual original. + /* We don't need to store array element #0, + * since it's aliased with the actual original. */ required_images--; original_history.reserve(required_images); common.original_history.resize(required_images); @@ -763,8 +763,10 @@ bool vulkan_filter_chain::init_history() RARCH_LOG("[Vulkan filter chain]: Using history of %u frames.\n", required_images); - // On first frame, we need to clear the textures to a known state, but we need - // a command buffer for that, so just defer to first frame. + /* On first frame, we need to clear the textures to + * a known state, but we need + * a command buffer for that, so just defer to first frame. + */ require_clear = true; return true; } @@ -775,7 +777,7 @@ bool vulkan_filter_chain::init_feedback() bool use_feedbacks = false; - // Final pass cannot have feedback. + /* Final pass cannot have feedback. */ for (unsigned i = 0; i < passes.size() - 1; i++) { bool use_feedback = false; @@ -879,7 +881,7 @@ bool vulkan_filter_chain::init_ubo() vkGetPhysicalDeviceProperties(gpu, &props); common.ubo_alignment = props.limits.minUniformBufferOffsetAlignment; - // Who knows. :) + /* Who knows. :) */ if (common.ubo_alignment == 0) common.ubo_alignment = 1; @@ -948,7 +950,7 @@ void vulkan_filter_chain::clear_history_and_feedback(VkCommandBuffer cmd) void vulkan_filter_chain::build_offscreen_passes(VkCommandBuffer cmd, const VkViewport &vp) { - // First frame, make sure our history and feedback textures are in a clean state. + /* First frame, make sure our history and feedback textures are in a clean state. */ if (require_clear) { clear_history_and_feedback(cmd); @@ -991,7 +993,7 @@ void vulkan_filter_chain::update_history(DeferredDisposer &disposer, VkCommandBu { VkImageLayout src_layout = input_texture.layout; - // Transition input texture to something appropriate. + /* Transition input texture to something appropriate. */ if (input_texture.layout != VK_IMAGE_LAYOUT_GENERAL) { vulkan_image_layout_transition_levels(cmd, @@ -1019,7 +1021,7 @@ void vulkan_filter_chain::update_history(DeferredDisposer &disposer, VkCommandBu tmp->copy(cmd, input_texture.image, src_layout); - // Transition input texture back. + /* Transition input texture back. */ if (input_texture.layout != VK_IMAGE_LAYOUT_GENERAL) { vulkan_image_layout_transition_levels(cmd, @@ -1032,16 +1034,17 @@ void vulkan_filter_chain::update_history(DeferredDisposer &disposer, VkCommandBu VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); } - // Should ring buffer, but we don't have *that* many passes. + /* Should ring buffer, but we don't have *that* many passes. */ move_backward(begin(original_history), end(original_history) - 1, end(original_history)); swap(original_history.front(), tmp); } void vulkan_filter_chain::end_frame(VkCommandBuffer cmd) { - // If we need to keep old frames, copy it after fragment is complete. - // TODO: We can improve pipelining by figuring out which pass is the last that reads from - // the history and dispatch the copy earlier. + /* If we need to keep old frames, copy it after fragment is complete. + * TODO: We can improve pipelining by figuring out which + * pass is the last that reads from + * the history and dispatch the copy earlier. */ if (!original_history.empty()) { DeferredDisposer disposer(deferred_calls[current_sync_index]); @@ -1052,7 +1055,7 @@ void vulkan_filter_chain::end_frame(VkCommandBuffer cmd) void vulkan_filter_chain::build_viewport_pass( VkCommandBuffer cmd, const VkViewport &vp, const float *mvp) { - // First frame, make sure our history and feedback textures are in a clean state. + /* First frame, make sure our history and feedback textures are in a clean state. */ if (require_clear) { clear_history_and_feedback(cmd); @@ -1092,7 +1095,7 @@ void vulkan_filter_chain::build_viewport_pass( passes.back()->build_commands(disposer, cmd, original, source, vp, mvp); - // For feedback FBOs, swap current and previous. + /* For feedback FBOs, swap current and previous. */ for (auto &pass : passes) pass->end_frame(); } @@ -1308,7 +1311,7 @@ bool Pass::init_pipeline_layout() vector<VkDescriptorSetLayoutBinding> bindings; vector<VkDescriptorPoolSize> desc_counts; - // Main UBO. + /* Main UBO. */ VkShaderStageFlags ubo_mask = 0; if (reflection.ubo_stage_mask & SLANG_STAGE_VERTEX_MASK) ubo_mask |= VK_SHADER_STAGE_VERTEX_BIT; @@ -1323,7 +1326,7 @@ bool Pass::init_pipeline_layout() desc_counts.push_back({ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, num_sync_indices }); } - // Semantic textures. + /* Semantic textures. */ for (auto &semantic : reflection.semantic_textures) { for (auto &texture : semantic) @@ -1358,7 +1361,7 @@ bool Pass::init_pipeline_layout() layout_info.setLayoutCount = 1; layout_info.pSetLayouts = &set_layout; - // Push constants + /* Push constants */ VkPushConstantRange push_range = {}; if (reflection.push_constant_stage_mask && reflection.push_constant_size) { @@ -1408,12 +1411,12 @@ bool Pass::init_pipeline() if (!init_pipeline_layout()) return false; - // Input assembly + /* Input assembly */ VkPipelineInputAssemblyStateCreateInfo input_assembly = { VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO }; input_assembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; - // VAO state + /* VAO state */ VkVertexInputAttributeDescription attributes[2] = {{0}}; VkVertexInputBindingDescription binding = {0}; @@ -1437,7 +1440,7 @@ bool Pass::init_pipeline() vertex_input.vertexAttributeDescriptionCount = 2; vertex_input.pVertexAttributeDescriptions = attributes; - // Raster state + /* Raster state */ VkPipelineRasterizationStateCreateInfo raster = { VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO }; raster.polygonMode = VK_POLYGON_MODE_FILL; @@ -1448,7 +1451,7 @@ bool Pass::init_pipeline() raster.depthBiasEnable = false; raster.lineWidth = 1.0f; - // Blend state + /* Blend state */ VkPipelineColorBlendAttachmentState blend_attachment = {0}; VkPipelineColorBlendStateCreateInfo blend = { VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO }; @@ -1457,13 +1460,13 @@ bool Pass::init_pipeline() blend.attachmentCount = 1; blend.pAttachments = &blend_attachment; - // Viewport state + /* Viewport state */ VkPipelineViewportStateCreateInfo viewport = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO }; viewport.viewportCount = 1; viewport.scissorCount = 1; - // Depth-stencil state + /* Depth-stencil state */ VkPipelineDepthStencilStateCreateInfo depth_stencil = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO }; depth_stencil.depthTestEnable = false; @@ -1473,12 +1476,12 @@ bool Pass::init_pipeline() depth_stencil.minDepthBounds = 0.0f; depth_stencil.maxDepthBounds = 1.0f; - // Multisample state + /* Multisample state */ VkPipelineMultisampleStateCreateInfo multisample = { VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO }; multisample.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; - // Dynamic state + /* Dynamic state */ VkPipelineDynamicStateCreateInfo dynamic = { VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO }; static const VkDynamicState dynamics[] = { @@ -1486,7 +1489,7 @@ bool Pass::init_pipeline() dynamic.pDynamicStates = dynamics; dynamic.dynamicStateCount = sizeof(dynamics) / sizeof(dynamics[0]); - // Shaders + /* Shaders */ VkPipelineShaderStageCreateInfo shader_stages[2] = { { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO }, { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO }, @@ -1539,16 +1542,18 @@ CommonResources::CommonResources(VkDevice device, const VkPhysicalDeviceMemoryProperties &memory_properties) : device(device) { - // The final pass uses an MVP designed for [0, 1] range VBO. - // For in-between passes, we just go with identity matrices, so keep it simple. + /* The final pass uses an MVP designed for [0, 1] range VBO. + * For in-between passes, we just go with identity matrices, + * so keep it simple. + */ const float vbo_data[] = { - // Offscreen + /* Offscreen */ -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, +1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, +1.0f, 1.0f, 1.0f, - // Final + /* Final */ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, +1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, @@ -1657,12 +1662,12 @@ void Pass::allocate_buffers() { if (reflection.ubo_stage_mask) { - // Align + /* Align */ common->ubo_offset = (common->ubo_offset + common->ubo_alignment - 1) & ~(common->ubo_alignment - 1); ubo_offset = common->ubo_offset; - // Allocate + /* Allocate */ common->ubo_offset += reflection.ubo_size; } } @@ -1719,7 +1724,7 @@ bool Pass::build() if (!slang_reflect_spirv(vertex_shader, fragment_shader, &reflection)) return false; - // Filter out parameters which we will never use anyways. + /* Filter out parameters which we will never use anyways. */ filtered_parameters.clear(); for (i = 0; i < reflection.semantic_float_parameters.size(); i++) @@ -1837,7 +1842,7 @@ void Pass::build_semantic_parameter(uint8_t *data, unsigned index, float value) { auto &refl = reflection.semantic_float_parameters[index]; - // We will have filtered out stale parameters. + /* We will have filtered out stale parameters. */ if (data && refl.uniform) *reinterpret_cast<float*>(data + refl.ubo_offset) = value; @@ -1876,7 +1881,7 @@ void Pass::build_semantic_texture_array(VkDescriptorSet set, uint8_t *buffer, void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, const float *mvp, const Texture &original, const Texture &source) { - // MVP + /* MVP */ if (buffer && reflection.semantics[SLANG_SEMANTIC_MVP].uniform) { size_t offset = reflection.semantics[SLANG_SEMANTIC_MVP].ubo_offset; @@ -1895,7 +1900,7 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, build_identity_matrix(reinterpret_cast<float *>(push.buffer.data() + (offset >> 2))); } - // Output information + /* Output information */ build_semantic_vec4(buffer, SLANG_SEMANTIC_OUTPUT, current_framebuffer_size.width, current_framebuffer_size.height); build_semantic_vec4(buffer, SLANG_SEMANTIC_FINAL_VIEWPORT, @@ -1904,21 +1909,21 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, build_semantic_uint(buffer, SLANG_SEMANTIC_FRAME_COUNT, frame_count_period ? uint32_t(frame_count % frame_count_period) : uint32_t(frame_count)); - // Standard inputs + /* Standard inputs */ build_semantic_texture(set, buffer, SLANG_TEXTURE_SEMANTIC_ORIGINAL, original); build_semantic_texture(set, buffer, SLANG_TEXTURE_SEMANTIC_SOURCE, source); - // ORIGINAL_HISTORY[0] is an alias of ORIGINAL. + /* ORIGINAL_HISTORY[0] is an alias of ORIGINAL. */ build_semantic_texture_array(set, buffer, SLANG_TEXTURE_SEMANTIC_ORIGINAL_HISTORY, 0, original); - // Parameters. + /* Parameters. */ for (auto ¶m : filtered_parameters) { float value = common->shader_preset->parameters[param.index].current; build_semantic_parameter(buffer, param.semantic_index, value); } - // Previous inputs. + /* Previous inputs. */ unsigned i = 0; for (auto &texture : common->original_history) { @@ -1928,7 +1933,7 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, i++; } - // Previous passes. + /* Previous passes. */ i = 0; for (auto &texture : common->pass_outputs) { @@ -1938,7 +1943,7 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, i++; } - // Feedback FBOs. + /* Feedback FBOs. */ i = 0; for (auto &texture : common->framebuffer_feedback) { @@ -1948,7 +1953,7 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, i++; } - // LUTs. + /* LUTs. */ i = 0; for (auto &lut : common->luts) { @@ -1997,10 +2002,10 @@ void Pass::build_commands( reflection.ubo_size); } - // The final pass is always executed inside - // another render pass since the frontend will - // want to overlay various things on top for - // the passes that end up on-screen. + /* The final pass is always executed inside + * another render pass since the frontend will + * want to overlay various things on top for + * the passes that end up on-screen. */ if (!final_pass) { /* Render. */ @@ -2086,7 +2091,7 @@ void Pass::build_commands( framebuffer->generate_mips(cmd); else { - // Barrier to sync with next pass. + /* Barrier to sync with next pass. */ vulkan_image_layout_transition_levels( cmd, framebuffer->get_image(),VK_REMAINING_MIP_LEVELS, @@ -2148,19 +2153,20 @@ void Framebuffer::clear(VkCommandBuffer cmd) void Framebuffer::generate_mips(VkCommandBuffer cmd) { unsigned i; - // This is run every frame, so make sure - // we aren't opting into the "lazy" way of doing this. :) + /* This is run every frame, so make sure + * we aren't opting into the "lazy" way of doing this. :) */ VkImageMemoryBarrier barriers[2] = { { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER }, { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER }, }; - // First, transfer the input mip level to TRANSFER_SRC_OPTIMAL. - // This should allow the surface to stay compressed. - // All subsequent mip-layers are now transferred into DST_OPTIMAL from - // UNDEFINED at this point. + /* First, transfer the input mip level to TRANSFER_SRC_OPTIMAL. + * This should allow the surface to stay compressed. + * All subsequent mip-layers are now transferred into DST_OPTIMAL from + * UNDEFINED at this point. + */ - // Input + /* Input */ barriers[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; barriers[0].oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; @@ -2173,7 +2179,7 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) barriers[0].subresourceRange.levelCount = 1; barriers[0].subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - // The rest of the mip chain + /* The rest of the mip chain */ barriers[1].srcAccessMask = 0; barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barriers[1].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -2196,8 +2202,9 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) for (i = 1; i < levels; i++) { - // For subsequent passes, we have to transition from DST_OPTIMAL to SRC_OPTIMAL, - // but only do so one mip-level at a time. + /* For subsequent passes, we have to transition + * from DST_OPTIMAL to SRC_OPTIMAL, + * but only do so one mip-level at a time. */ if (i > 1) { barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; @@ -2241,10 +2248,15 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) 1, &blit_region, VK_FILTER_LINEAR); } - // We are now done, and we have all mip-levels except the last in TRANSFER_SRC_OPTIMAL, - // and the last one still on TRANSFER_DST_OPTIMAL, so do a final barrier which - // moves everything to SHADER_READ_ONLY_OPTIMAL in one go along with the execution barrier to next pass. - // Read-to-read memory barrier, so only need execution barrier for first transition. + /* We are now done, and we have all mip-levels except + * the last in TRANSFER_SRC_OPTIMAL, + * and the last one still on TRANSFER_DST_OPTIMAL, + * so do a final barrier which + * moves everything to SHADER_READ_ONLY_OPTIMAL in + * one go along with the execution barrier to next pass. + * Read-to-read memory barrier, so only need execution + * barrier for first transition. + */ barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; barriers[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; barriers[0].subresourceRange.baseMipLevel = 0; @@ -2252,7 +2264,7 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) barriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; barriers[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - // This is read-after-write barrier. + /* This is read-after-write barrier. */ barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barriers[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; barriers[1].subresourceRange.baseMipLevel = levels - 1; @@ -2268,8 +2280,10 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) 0, nullptr, 2, barriers); - // Next pass will wait for ALL_GRAPHICS_BIT, and since we have dstStage as FRAGMENT_SHADER, - // the dependency chain will ensure we don't start next pass until the mipchain is complete. + /* Next pass will wait for ALL_GRAPHICS_BIT, and since + * we have dstStage as FRAGMENT_SHADER, + * the dependency chain will ensure we don't start + * next pass until the mipchain is complete. */ } void Framebuffer::copy(VkCommandBuffer cmd, @@ -2336,11 +2350,12 @@ void Framebuffer::init(DeferredDisposer *disposer) memory_properties, mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - // Can reuse already allocated memory. + /* Can reuse already allocated memory. */ if (memory.size < mem_reqs.size || memory.type != alloc.memoryTypeIndex) { - // Memory might still be in use since we don't want to totally stall - // the world for framebuffer recreation. + /* Memory might still be in use since we don't want + * to totally stall + * the world for framebuffer recreation. */ if (memory.memory != VK_NULL_HANDLE && disposer) { auto d = device; @@ -2385,8 +2400,8 @@ void Framebuffer::init_render_pass() VkAttachmentReference color_ref = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; - // We will always write to the entire framebuffer, - // so we don't really need to clear. + /* We will always write to the entire framebuffer, + * so we don't really need to clear. */ VkAttachmentDescription attachment = {0}; attachment.format = format; attachment.samples = VK_SAMPLE_COUNT_1_BIT; @@ -2435,13 +2450,13 @@ void Framebuffer::set_size(DeferredDisposer &disposer, const Size2D &size, VkFor size.width, size.height, (unsigned)this->format); { - // The current framebuffers, etc, might still be in use - // so defer deletion. - // We'll most likely be able to reuse the memory, - // so don't free it here. - // - // Fake lambda init captures for C++11. - // + /* The current framebuffers, etc, might still be in use + * so defer deletion. + * We'll most likely be able to reuse the memory, + * so don't free it here. + * + * Fake lambda init captures for C++11. + */ auto d = device; auto i = image; auto v = view; @@ -2479,7 +2494,7 @@ Framebuffer::~Framebuffer() vkFreeMemory(device, memory.memory, nullptr); } -// C glue +/* C glue */ vulkan_filter_chain_t *vulkan_filter_chain_new( const vulkan_filter_chain_create_info *info) { @@ -2871,7 +2886,8 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( if (itr != shader->parameters + shader->num_parameters) { - // Allow duplicate #pragma parameter, but only if they are exactly the same. + /* Allow duplicate #pragma parameter, but + * only if they are exactly the same. */ if (meta_param.desc != itr->desc || meta_param.initial != itr->initial || meta_param.minimum != itr->minimum || @@ -2914,7 +2930,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( if (!output.meta.name.empty()) chain->set_pass_name(i, output.meta.name.c_str()); - // Preset overrides. + /* Preset overrides. */ if (*pass->alias) chain->set_pass_name(i, pass->alias); @@ -2929,9 +2945,10 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( pass_info.address = wrap_to_address(pass->wrap); pass_info.max_levels = 1; - // TODO: Expose max_levels in slangp. - // CGP format is a bit awkward in that it uses mipmap_input, - // so we much check if next pass needs the mipmapping. + /* TODO: Expose max_levels in slangp. + * CGP format is a bit awkward in that it uses mipmap_input, + * so we much check if next pass needs the mipmapping. + */ if (next_pass && next_pass->mipmap) pass_info.max_levels = ~0u; @@ -2940,7 +2957,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( bool explicit_format = output.meta.rt_format != SLANG_FORMAT_UNKNOWN; - // Set a reasonable default. + /* Set a reasonable default. */ if (output.meta.rt_format == SLANG_FORMAT_UNKNOWN) output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_UNORM; @@ -2972,13 +2989,12 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( } else { - // Preset overrides shader. - // Kinda ugly ... + /* Preset overrides shader. + * Kinda ugly ... */ if (pass->fbo.srgb_fbo) output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_SRGB; else if (pass->fbo.fp_fbo) output.meta.rt_format = SLANG_FORMAT_R16G16B16A16_SFLOAT; - /// pass_info.rt_format = glslang_format_to_vk(output.meta.rt_format); RARCH_LOG("[slang]: Using render target format %s for pass output #%u.\n",