Files
how-to-vulkan/ktx/build/docs/html/libktx/vkload_8cpp-example.html
T
2026-06-14 19:09:18 +01:00

268 lines
19 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libktx Reference: vkload.cpp</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="ktx_logo_200.png"/></td>
<td id="projectalign">
<div id="projectname">libktx Reference<span id="projectnumber">&#160;0.0.0</span>
</div>
<div id="projectbrief">Libraries and tools to create and read KTX image texture files.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('vkload_8cpp-example.html','',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">vkload.cpp</div></div>
</div><!--header-->
<div class="contents">
<p>This shows how to create and load a Vulkan image using the Vulkan texture image loading functions.</p>
<div class="fragment"><div class="line"><span class="comment">// Copyright 2018-2020 The Khronos Group Inc.</span></div>
<div class="line"><span class="comment">// SPDX-License-Identifier: Apache-2.0</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div>
<div class="line"><span class="preprocessor">#include &lt;ktxvulkan.h&gt;</span></div>
<div class="line"><span class="comment">// Use c++ to keep the example short. Not required.</span></div>
<div class="line"><span class="preprocessor">#include &lt;vulkan/vulkan.hpp&gt;</span></div>
<div class="line"> </div>
<div class="line"><span class="keyword">class </span>Texture {</div>
<div class="line"> <span class="keyword">public</span>:</div>
<div class="line"> Texture(<span class="keyword">const</span> std::string ktxfile);</div>
<div class="line"> ~Texture();</div>
<div class="line"> </div>
<div class="line"> <span class="keyword">protected</span>:</div>
<div class="line"> <a id="_a0" name="_a0"></a><a class="code hl_class" href="structktxVulkanTexture.html">ktxVulkanTexture</a> texture;</div>
<div class="line"> vk::PhysicalDevice gpu;</div>
<div class="line"> vk::Device device;</div>
<div class="line"> vk::Queue queue;</div>
<div class="line"> vk::CommandPool commandPool;</div>
<div class="line"> </div>
<div class="line"> cleanup();</div>
<div class="line"> prepareSamplerAndView();</div>
<div class="line">};</div>
<div class="line"> </div>
<div class="line">Texture::Texture(<span class="keyword">const</span> std::string ktxfile)</div>
<div class="line">{</div>
<div class="line"> <a id="_a1" name="_a1"></a><a class="code hl_class" href="structktxVulkanDeviceInfo.html">ktxVulkanDeviceInfo</a> kvdi;</div>
<div class="line"> <a id="_a2" name="_a2"></a><a class="code hl_class" href="structktxTexture.html">ktxTexture</a>* kTexture;</div>
<div class="line"> <a id="_a3" name="_a3"></a><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a> ktxresult;</div>
<div class="line"> </div>
<div class="line"> createVulkanInstance();</div>
<div class="line"> findVulkanGpu(); <span class="comment">// Find a suitable physical device</span></div>
<div class="line"> createVulkanSurface();</div>
<div class="line"> createVulkanDevice();</div>
<div class="line"> prepareVulkanSwapchain();</div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> .</span></div>
<div class="line"><span class="comment"> .</span></div>
<div class="line"><span class="comment"> .</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> <span class="comment">// This structure is used to pass the Vulkan device information to the loader</span></div>
<div class="line"> <span class="comment">// with the expectation that app&#39;s will typically load many textures.</span></div>
<div class="line"> ktxVulkanDeviceInfo_Construct(&amp;kvdi, gpu, device, queue, commandPool, <span class="keyword">nullptr</span>);</div>
<div class="line"> </div>
<div class="line"> ktxresult = ktxTexture_CreateFromNamedFile(</div>
<div class="line"> (getAssetPath() + ktxfile).c_str(),</div>
<div class="line"> KTX_TEXTURE_CREATE_NO_FLAGS,</div>
<div class="line"> &amp;kTexture);</div>
<div class="line"> <span class="keywordflow">if</span> (<a id="_a4" name="_a4"></a><a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a> != ktxresult) {</div>
<div class="line"> std::stringstream message;</div>
<div class="line"> </div>
<div class="line"> message &lt;&lt; <span class="stringliteral">&quot;Creation of ktxTexture from \&quot;&quot;</span> &lt;&lt; getAssetPath()</div>
<div class="line"> &lt;&lt; ktxfile &lt;&lt; <span class="stringliteral">&quot;\&quot; failed: &quot;</span> &lt;&lt; <a id="a5" name="a5"></a><a class="code hl_function" href="ktx_8h.html#a829eac221b33617c15a1b5a898a0771a">ktxErrorString</a>(ktxresult);</div>
<div class="line"> <span class="keywordflow">throw</span> std::runtime_error(message.str());</div>
<div class="line"> }</div>
<div class="line"> ktxresult = ktxTexture_VkUploadEx(kTexture, &amp;kvdi, &amp;texture,</div>
<div class="line"> VK_IMAGE_TILING_OPTIMAL,</div>
<div class="line"> VK_IMAGE_USAGE_SAMPLED_BIT,</div>
<div class="line"> VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);</div>
<div class="line"> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a> != ktxresult) {</div>
<div class="line"> std::stringstream message;</div>
<div class="line"> </div>
<div class="line"> message &lt;&lt; <span class="stringliteral">&quot;ktxTexture_VkUpload failed: &quot;</span> &lt;&lt; <a class="code hl_function" href="ktx_8h.html#a829eac221b33617c15a1b5a898a0771a">ktxErrorString</a>(ktxresult);</div>
<div class="line"> <span class="keywordflow">throw</span> std::runtime_error(message.str());</div>
<div class="line"> }</div>
<div class="line"> </div>
<div class="line"> <span class="keywordtype">char</span>* pValue;</div>
<div class="line"> uint32_t valueLen;</div>
<div class="line"> <span class="keywordflow">if</span> (<a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a> == ktxHashTable_FindValue(&amp;kTexture-&gt;<a id="a6" name="a6"></a><a class="code hl_variable" href="structktxTexture.html#a57141753cd2eb0967c9c071d853c5d32">kvDataHead</a>,</div>
<div class="line"> <a id="_a7" name="_a7"></a><a class="code hl_define" href="ktx_8h.html#a7eebf850576083e740cf1f418eed39a0">KTX_ORIENTATION_KEY</a>,</div>
<div class="line"> &amp;valueLen, (<span class="keywordtype">void</span>**)&amp;pValue))</div>
<div class="line"> {</div>
<div class="line"> <span class="keywordtype">char</span> s, t;</div>
<div class="line"> </div>
<div class="line"> <span class="keywordflow">if</span> (sscanf(pValue, <a id="_a8" name="_a8"></a><a class="code hl_define" href="ktx_8h.html#ad235113b0090e64ad23a0cf7097e1b7a">KTX_ORIENTATION2_FMT</a>, &amp;s, &amp;t) == 2) {</div>
<div class="line"> <span class="keywordflow">if</span> (s == <span class="charliteral">&#39;l&#39;</span>) sign_s = -1;</div>
<div class="line"> <span class="keywordflow">if</span> (t == <span class="charliteral">&#39;u&#39;</span>) sign_t = -1;</div>
<div class="line"> }</div>
<div class="line"> }</div>
<div class="line"> </div>
<div class="line"> <a id="a9" name="a9"></a><a class="code hl_define" href="ktx_8h.html#a0becd37ccf729eed8723b969bb93df3d">ktxTexture_Destroy</a>(kTexture);</div>
<div class="line"> ktxVulkanDeviceInfo_destruct(&amp;kvdi);</div>
<div class="line"> </div>
<div class="line"> <span class="keywordflow">try</span> {</div>
<div class="line"> prepareSamplerAndView(); <span class="comment">// See below for implementation.</span></div>
<div class="line"> <span class="comment">// Setup a layout with, e.g., a binding for a combined image-sampler.</span></div>
<div class="line"> setupDescriptorSetLayout();</div>
<div class="line"> <span class="comment">// Create a descriptor set and update it with the sampler and image view handles.</span></div>
<div class="line"> setupDescriptorSet();</div>
<div class="line"> preparePipelines();</div>
<div class="line"> setupDescriptorPool();</div>
<div class="line"> setupDescriptorSet();</div>
<div class="line"> buildCommandBuffers();</div>
<div class="line"> } <span class="keywordflow">catch</span> (std::exception&amp;) {</div>
<div class="line"> cleanup();</div>
<div class="line"> <span class="keywordflow">throw</span>;</div>
<div class="line"> }</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line">Texture::~Texture()</div>
<div class="line">{</div>
<div class="line"> cleanup();</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line">Texture::cleanup()</div>
<div class="line">{</div>
<div class="line"> destroyCommandBuffers();</div>
<div class="line"> destroySampler();</div>
<div class="line"> destroyImageview();</div>
<div class="line"> ktxVulkanTexture_destruct(&amp;texture, device, <span class="keyword">nullptr</span>);</div>
<div class="line"> <span class="comment">/*</span></div>
<div class="line"><span class="comment"> .</span></div>
<div class="line"><span class="comment"> .</span></div>
<div class="line"><span class="comment"> .</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">void</span></div>
<div class="line">Texture::prepareSamplerAndView()</div>
<div class="line">{</div>
<div class="line"> <span class="comment">// Create sampler.</span></div>
<div class="line"> vk::SamplerCreateInfo samplerInfo;</div>
<div class="line"> <span class="comment">// Set the non-default values</span></div>
<div class="line"> samplerInfo.magFilter = vk::Filter::eLinear;</div>
<div class="line"> samplerInfo.minFilter = vk::Filter::eLinear;</div>
<div class="line"> samplerInfo.mipmapMode = vk::SamplerMipmapMode::eLinear;</div>
<div class="line"> samplerInfo.maxLod = texture.levelCount;</div>
<div class="line"> samplerInfo.anisotropyEnable = <span class="keyword">false</span>;</div>
<div class="line"> samplerInfo.maxAnisotropy = 1.0;</div>
<div class="line"> samplerInfo.borderColor = vk::BorderColor::eFloatOpaqueWhite;</div>
<div class="line"> sampler = vkctx.device.createSampler(samplerInfo);</div>
<div class="line"> </div>
<div class="line"> <span class="comment">// Create image view.</span></div>
<div class="line"> <span class="comment">// Textures are not directly accessed by the shaders and are abstracted</span></div>
<div class="line"> <span class="comment">// by image views containing additional information and sub resource</span></div>
<div class="line"> <span class="comment">// ranges.</span></div>
<div class="line"> vk::ImageViewCreateInfo viewInfo;</div>
<div class="line"> <span class="comment">// Set the non-default values.</span></div>
<div class="line"> viewInfo.image = texture.image;</div>
<div class="line"> viewInfo.format = <span class="keyword">static_cast&lt;</span>vk::Format<span class="keyword">&gt;</span>(texture.imageFormat);</div>
<div class="line"> viewInfo.viewType = <span class="keyword">static_cast&lt;</span>vk::ImageViewType<span class="keyword">&gt;</span>(texture.viewType);</div>
<div class="line"> viewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;</div>
<div class="line"> viewInfo.subresourceRange.layerCount = texture.layerCount;</div>
<div class="line"> viewInfo.subresourceRange.levelCount = texture.levelCount;</div>
<div class="line"> imageView = vkctx.device.createImageView(viewInfo);</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line"><span class="comment">/* -*- tab-width: 4; -*- */</span></div>
<div class="line"><span class="comment">/* vi: set sw=2 ts=4 expandtab: */</span></div>
<div class="ttc" id="aktx_8h_html_a0becd37ccf729eed8723b969bb93df3d"><div class="ttname"><a href="ktx_8h.html#a0becd37ccf729eed8723b969bb93df3d">ktxTexture_Destroy</a></div><div class="ttdeci">#define ktxTexture_Destroy(This)</div><div class="ttdoc">Helper for calling the Destroy virtual method of a ktxTexture.</div><div class="ttdef"><b>Definition</b> ktx.h:533</div></div>
<div class="ttc" id="aktx_8h_html_a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98"><div class="ttname"><a href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a></div><div class="ttdeci">@ KTX_SUCCESS</div><div class="ttdef"><b>Definition</b> ktx.h:170</div></div>
<div class="ttc" id="aktx_8h_html_a7eebf850576083e740cf1f418eed39a0"><div class="ttname"><a href="ktx_8h.html#a7eebf850576083e740cf1f418eed39a0">KTX_ORIENTATION_KEY</a></div><div class="ttdeci">#define KTX_ORIENTATION_KEY</div><div class="ttdoc">Key string for standard orientation metadata.</div><div class="ttdef"><b>Definition</b> ktx.h:124</div></div>
<div class="ttc" id="aktx_8h_html_a829eac221b33617c15a1b5a898a0771a"><div class="ttname"><a href="ktx_8h.html#a829eac221b33617c15a1b5a898a0771a">ktxErrorString</a></div><div class="ttdeci">KTX_API const char *KTX_APIENTRY ktxErrorString(KTX_error_code error)</div><div class="ttdoc">Return a string corresponding to a KTX error code.</div><div class="ttdef"><b>Definition</b> strings.c:59</div></div>
<div class="ttc" id="aktx_8h_html_ad235113b0090e64ad23a0cf7097e1b7a"><div class="ttname"><a href="ktx_8h.html#ad235113b0090e64ad23a0cf7097e1b7a">KTX_ORIENTATION2_FMT</a></div><div class="ttdeci">#define KTX_ORIENTATION2_FMT</div><div class="ttdoc">Standard KTX 1 format for 2D orientation value.</div><div class="ttdef"><b>Definition</b> ktx.h:149</div></div>
<div class="ttc" id="aktx_8h_html_ad2efa40e38ebae48371375db92d34eaa"><div class="ttname"><a href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div><div class="ttdeci">#define KTX_error_code</div><div class="ttdoc">For backward compatibility.</div><div class="ttdef"><b>Definition</b> ktx.h:198</div></div>
<div class="ttc" id="astructktxTexture_html"><div class="ttname"><a href="structktxTexture.html">ktxTexture</a></div><div class="ttdoc">Base class representing a texture.</div><div class="ttdef"><b>Definition</b> ktx.h:287</div></div>
<div class="ttc" id="astructktxTexture_html_a57141753cd2eb0967c9c071d853c5d32"><div class="ttname"><a href="structktxTexture.html#a57141753cd2eb0967c9c071d853c5d32">ktxTexture::kvDataHead</a></div><div class="ttdeci">ktxHashList kvDataHead</div><div class="ttdoc">Head of the hash list of metadata.</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
<div class="ttc" id="astructktxVulkanDeviceInfo_html"><div class="ttname"><a href="structktxVulkanDeviceInfo.html">ktxVulkanDeviceInfo</a></div><div class="ttdoc">Struct for passing information about the Vulkan device on which to create images to the texture image...</div><div class="ttdef"><b>Definition</b> ktxvulkan.h:188</div></div>
<div class="ttc" id="astructktxVulkanTexture_html"><div class="ttname"><a href="structktxVulkanTexture.html">ktxVulkanTexture</a></div><div class="ttdoc">Struct for returning information about the Vulkan texture image created by the ktxTexture_VkUpload* f...</div><div class="ttdef"><b>Definition</b> ktxvulkan.h:108</div></div>
</div><!-- fragment --> </div><!-- contents -->
</div><!-- doc-content -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated on <span class="timestamp"></span> for libktx Reference by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.16.1 </li>
</ul>
</div>
</body>
</html>