1310 lines
114 KiB
HTML
1310 lines
114 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: glloader.c</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"> 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('glloader_8c-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">glloader.c</div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<p>This is an example of using the low-level <a class="el" href="structktxTexture.html" title="Base class representing a texture.">ktxTexture</a> API to create and load an OpenGL texture. It is a fragment of the code used by <a class="el" href="group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f" title="ktxTexture1_GLUpload">ktxTexture1_GLUpload</a> and <a class="el" href="group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c" title="ktxTexture2_GLUpload">ktxTexture2_GLUpload</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="preprocessor">#include <<a class="code" href="ktx_8h.html">ktx.h</a>></span></div>
|
|
<div class="ttc" id="aktx_8h_html"><div class="ttname"><a href="ktx_8h.html">ktx.h</a></div><div class="ttdoc">Declares the public functions and structures of the KTX API.</div></div>
|
|
</div><!-- fragment --><p>This structure is used to pass to a callback function data that is uniform across all images. </p><div class="fragment"><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>ktx_cbdata {</div>
|
|
<div class="line"> GLenum glTarget;</div>
|
|
<div class="line"> GLenum glFormat;</div>
|
|
<div class="line"> GLenum glInternalformat;</div>
|
|
<div class="line"> GLenum glType;</div>
|
|
<div class="line"> GLenum glError;</div>
|
|
<div class="line"> GLuint numLayers;</div>
|
|
<div class="line">} ktx_cbdata;</div>
|
|
</div><!-- fragment --><p>One of these callbacks, selected by <a class="el" href="group__ktx__glloader.html#ga058297b66c5a7fd1f1bbaf718a887b9f" title="ktxTexture1_GLUpload">ktxTexture1_GLUpload</a> or <a class="el" href="group__ktx__glloader.html#ga7624860df8e44573862fa5754ea2976c" title="ktxTexture2_GLUpload">ktxTexture2_GLUpload</a> based on the dimensionality and arrayness of the texture, is called from <a class="el" href="group__reader.html#gae7c4b8bbe26379f2076f93050c0673c1" title="ktxTexture_IterateLevelFaces">ktxTexture_IterateLevelFaces</a> to upload the texture data to OpenGL. </p><div class="fragment"><div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">texImage1DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(faceLodSize);</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> UNUSED(height);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glTexImage1D != NULL);</div>
|
|
<div class="line"> gl.glTexImage1D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width, 0,</div>
|
|
<div class="line"> cbData->glFormat, cbData->glType, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">compressedTexImage1DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> UNUSED(height);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (faceLodSize > UINT32_MAX)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// Too big for OpenGL {,ES}.</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glCompressedTexImage1D != NULL);</div>
|
|
<div class="line"> gl.glCompressedTexImage1D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width, 0,</div>
|
|
<div class="line"> (ktx_uint32_t)faceLodSize, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">texImage2DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> UNUSED(faceLodSize);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glTexImage2D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,</div>
|
|
<div class="line"> cbData->glFormat, cbData->glType, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">compressedTexImage2DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> GLenum glerror;</div>
|
|
<div class="line"> <a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a> result;</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (faceLodSize > UINT32_MAX)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// Too big for OpenGL {,ES}.</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// It is simpler to just attempt to load the format, rather than divine</span></div>
|
|
<div class="line"> <span class="comment">// which formats are supported by the implementation. In the event of an</span></div>
|
|
<div class="line"> <span class="comment">// error, software unpacking can be attempted.</span></div>
|
|
<div class="line"> glCompressedTexImage2D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers,</div>
|
|
<div class="line"> 0,</div>
|
|
<div class="line"> (ktx_uint32_t)faceLodSize, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glerror = glGetError();</div>
|
|
<div class="line"><span class="preprocessor">#if SUPPORT_SOFTWARE_ETC_UNPACK</span></div>
|
|
<div class="line"> <span class="comment">// Renderion is returning INVALID_VALUE. Oops!!</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((glerror == GL_INVALID_ENUM || glerror == GL_INVALID_VALUE)</div>
|
|
<div class="line"> && (cbData->glInternalformat == GL_ETC1_RGB8_OES</div>
|
|
<div class="line"> || (cbData->glInternalformat >= GL_COMPRESSED_R11_EAC</div>
|
|
<div class="line"> && cbData->glInternalformat <= GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)</div>
|
|
<div class="line"> ))</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> GLubyte* unpacked;</div>
|
|
<div class="line"> GLenum format, internalformat, type;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> result = _ktxUnpackETC((GLubyte*)pixels, cbData->glInternalformat,</div>
|
|
<div class="line"> width, height, &unpacked,</div>
|
|
<div class="line"> &format, &internalformat,</div>
|
|
<div class="line"> &type, R16Formats, supportsSRGB);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result != <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!(sizedFormats & _NON_LEGACY_FORMATS)) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (internalformat == GL_RGB8)</div>
|
|
<div class="line"> internalformat = GL_RGB;</div>
|
|
<div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (internalformat == GL_RGBA8)</div>
|
|
<div class="line"> internalformat = GL_RGBA;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> glTexImage2D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> internalformat, width,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,</div>
|
|
<div class="line"> format, type, unpacked);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> free(unpacked);</div>
|
|
<div class="line"> glerror = glGetError();</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glerror) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">texImage3DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(faceLodSize);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glTexImage3D != NULL);</div>
|
|
<div class="line"> gl.glTexImage3D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat,</div>
|
|
<div class="line"> width, height,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,</div>
|
|
<div class="line"> 0,</div>
|
|
<div class="line"> cbData->glFormat, cbData->glType, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">compressedTexImage3DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (faceLodSize > UINT32_MAX)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// Too big for OpenGL {,ES}.</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glCompressedTexImage3D != NULL);</div>
|
|
<div class="line"> gl.glCompressedTexImage3D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat,</div>
|
|
<div class="line"> width, height,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,</div>
|
|
<div class="line"> 0,</div>
|
|
<div class="line"> (ktx_uint32_t)faceLodSize, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><p>This function creates the GL texture object and sets up the callbacks to load the image data into it. </p><div class="fragment"><div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">ktxTexture_GLUploadPrivate(<a class="code hl_class" href="structktxTexture.html">ktxTexture</a>* This, ktx_glformatinfo* formatInfo,</div>
|
|
<div class="line"> GLuint* pTexture, GLenum* pTarget, GLenum* pGlerror)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> GLuint texname;</div>
|
|
<div class="line"> GLenum target = GL_TEXTURE_2D;</div>
|
|
<div class="line"> <span class="keywordtype">int</span> texnameUser;</div>
|
|
<div class="line"> <a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a> result = <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> ktx_cbdata cbData;</div>
|
|
<div class="line"> PFNKTXITERCB iterCb = NULL;</div>
|
|
<div class="line"> <span class="keywordtype">int</span> dimensions;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (pGlerror)</div>
|
|
<div class="line"> *pGlerror = GL_NO_ERROR;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(This && pTarget);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (contextProfile == 0)</div>
|
|
<div class="line"> discoverContextCapabilities();</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> texnameUser = pTexture && *pTexture;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (texnameUser) {</div>
|
|
<div class="line"> texname = *pTexture;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> glGenTextures(1, &texname);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> cbData.glFormat = formatInfo->glFormat;</div>
|
|
<div class="line"> cbData.glInternalformat = formatInfo->glInternalformat;</div>
|
|
<div class="line"> cbData.glType = formatInfo->glType;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> dimensions = This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a>;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a9b5ca8c2e3fd76d8b427928775289078">isArray</a>) {</div>
|
|
<div class="line"> dimensions += 1;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068">numFaces</a> == 6) {</div>
|
|
<div class="line"> <span class="comment">/* ktxCheckHeader1_ should have caught this. */</span></div>
|
|
<div class="line"> assert(This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a> == 2);</div>
|
|
<div class="line"> target = GL_TEXTURE_CUBE_MAP_ARRAY;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 1: target = GL_TEXTURE_1D_ARRAY; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 2: target = GL_TEXTURE_2D_ARRAY; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="comment">/* _ktxCheckHeader should have caught this. */</span></div>
|
|
<div class="line"> <span class="keywordflow">default</span>: assert(KTX_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> cbData.numLayers = This->numLayers;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068">numFaces</a> == 6) {</div>
|
|
<div class="line"> <span class="comment">/* ktxCheckHeader1_ should have caught this. */</span></div>
|
|
<div class="line"> assert(This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a> == 2);</div>
|
|
<div class="line"> target = GL_TEXTURE_CUBE_MAP;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 1: target = GL_TEXTURE_1D; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 2: target = GL_TEXTURE_2D; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 3: target = GL_TEXTURE_3D; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="comment">/* _ktxCheckHeader shold have caught this. */</span></div>
|
|
<div class="line"> <span class="keywordflow">default</span>: assert(KTX_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> cbData.numLayers = 0;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_1D &&</div>
|
|
<div class="line"> ((This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glCompressedTexImage1D == NULL)) ||</div>
|
|
<div class="line"> (!This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glTexImage1D == NULL))))</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* Reject 3D texture if unsupported. */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_3D &&</div>
|
|
<div class="line"> ((This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glCompressedTexImage3D == NULL)) ||</div>
|
|
<div class="line"> (!This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glTexImage3D == NULL))))</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* Reject cube map arrays if not supported. */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_CUBE_MAP_ARRAY && !supportsCubeMapArrays) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* XXX Need to reject other array textures & cube maps if not supported. */</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (dimensions) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 1:</div>
|
|
<div class="line"> iterCb = This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a></div>
|
|
<div class="line"> ? compressedTexImage1DCallback : texImage1DCallback;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 2:</div>
|
|
<div class="line"> iterCb = This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a></div>
|
|
<div class="line"> ? compressedTexImage2DCallback : texImage2DCallback;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 3:</div>
|
|
<div class="line"> iterCb = This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a></div>
|
|
<div class="line"> ? compressedTexImage3DCallback : texImage3DCallback;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">default</span>:</div>
|
|
<div class="line"> assert(KTX_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glBindTexture(target, texname);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">generateMipmaps</a> && (gl.glGenerateMipmap == NULL)) {</div>
|
|
<div class="line"> glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!This-><a class="code hl_variable" href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">generateMipmaps</a> && supportsMaxLevel)</div>
|
|
<div class="line"> glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, This-><a class="code hl_variable" href="structktxTexture.html#a782126a62c27ee8660a14565b906694c">numLevels</a> - 1);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_CUBE_MAP) {</div>
|
|
<div class="line"> cbData.glTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> cbData.glTarget = target;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a>) {</div>
|
|
<div class="line"><span class="preprocessor">#if SUPPORT_LEGACY_FORMAT_CONVERSION</span></div>
|
|
<div class="line"> <span class="comment">// If sized legacy formats are supported there is no need to convert.</span></div>
|
|
<div class="line"> <span class="comment">// If only unsized formats are supported, there is no point in</span></div>
|
|
<div class="line"> <span class="comment">// converting as the modern formats aren't supported either.</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (sizedFormats == _NON_LEGACY_FORMATS && supportsSwizzle) {</div>
|
|
<div class="line"> convertFormat(target, &cbData.glFormat, &cbData.glInternalformat);</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sizedFormats == _NO_SIZED_FORMATS)</div>
|
|
<div class="line"> cbData.glInternalformat = formatInfo->glBaseInternalformat;</div>
|
|
<div class="line"><span class="preprocessor">#else</span></div>
|
|
<div class="line"> <span class="comment">// When no sized formats are supported, or legacy sized formats are not</span></div>
|
|
<div class="line"> <span class="comment">// supported, must change internal format.</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (sizedFormats == _NO_SIZED_FORMATS</div>
|
|
<div class="line"> || (!(sizedFormats & _LEGACY_FORMATS) &&</div>
|
|
<div class="line"> (formatInfo->glBaseInternalformat == GL_ALPHA</div>
|
|
<div class="line"> || formatInfo->glBaseInternalformat == GL_LUMINANCE</div>
|
|
<div class="line"> || formatInfo->glBaseInternalformat == GL_LUMINANCE_ALPHA</div>
|
|
<div class="line"> || formatInfo->glBaseInternalformat == GL_INTENSITY))) {</div>
|
|
<div class="line"> cbData.glInternalformat = formatInfo->glBaseInternalformat;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (ktxTexture_isActiveStream(<a class="code hl_class" href="structktxTexture.html">ktxTexture</a>(This)))</div>
|
|
<div class="line"> result = <a class="code hl_define" href="ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514">ktxTexture_IterateLoadLevelFaces</a>(This, iterCb, &cbData);</div>
|
|
<div class="line"> <span class="keywordflow">else</span></div>
|
|
<div class="line"> result = ktxTexture_IterateLevelFaces(This, iterCb, &cbData);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* GL errors are the only reason for failure. */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result != <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a> && cbData.glError != GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (pGlerror)</div>
|
|
<div class="line"> *pGlerror = cbData.glError;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result == <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>)</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="comment">// Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">generateMipmaps</a> && gl.glGenerateMipmap) {</div>
|
|
<div class="line"> gl.glGenerateMipmap(target);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> *pTarget = target;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (pTexture) {</div>
|
|
<div class="line"> *pTexture = texname;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!texnameUser) {</div>
|
|
<div class="line"> glDeleteTextures(1, &texname);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line">}</div>
|
|
</div><!-- fragment --><div class="fragment"><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="line"> </div>
|
|
<div class="line"><span class="comment">/*</span></div>
|
|
<div class="line"><span class="comment"> * Copyright 2010-2020 Mark Callow.</span></div>
|
|
<div class="line"><span class="comment"> * SPDX-License-Identifier: Apache-2.0</span></div>
|
|
<div class="line"><span class="comment"> */</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">/*</span></div>
|
|
<div class="line"><span class="comment"> * @internal</span></div>
|
|
<div class="line"><span class="comment"> * @file</span></div>
|
|
<div class="line"><span class="comment"> * @~English</span></div>
|
|
<div class="line"><span class="comment"> *</span></div>
|
|
<div class="line"><span class="comment"> * @brief Functions for instantiating GL or GLES textures from KTX files.</span></div>
|
|
<div class="line"><span class="comment"> *</span></div>
|
|
<div class="line"><span class="comment"> * @author Georg Kolling, Imagination Technology</span></div>
|
|
<div class="line"><span class="comment"> * @author Mark Callow, HI Corporation & Edgewise Consulting. github.com/MarkCallow</span></div>
|
|
<div class="line"><span class="comment"> */</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="preprocessor">#ifdef _WIN32</span></div>
|
|
<div class="line"><span class="preprocessor">#define _CRT_SECURE_NO_WARNINGS</span></div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="preprocessor">#include <assert.h></span></div>
|
|
<div class="line"><span class="preprocessor">#include <string.h></span></div>
|
|
<div class="line"><span class="preprocessor">#include <stdint.h></span></div>
|
|
<div class="line"><span class="preprocessor">#include <stdlib.h></span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="preprocessor">#include "gl_funcs.h"</span></div>
|
|
<div class="line"><span class="preprocessor">#define SUPPORT_LEGACY_FORMAT_CONVERSION 0</span></div>
|
|
<div class="line"><span class="comment">// Legacy formats are not supported by libktx. Consider removing format conversion code.</span></div>
|
|
<div class="line"><span class="preprocessor">#if SUPPORT_LEGACY_FORMAT_CONVERSION</span></div>
|
|
<div class="line"> <span class="comment">// For legacy formats defined only in compatibility mode and as extensions.</span></div>
|
|
<div class="line"><span class="preprocessor"> #include "GL/glext.h"</span></div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="preprocessor">#include "<a class="code" href="ktx_8h.html">ktx.h</a>"</span></div>
|
|
<div class="line"><span class="preprocessor">#include "ktxint.h"</span></div>
|
|
<div class="line"><span class="preprocessor">#include "texture.h"</span></div>
|
|
<div class="line"><span class="preprocessor">#include "vk2gl.h"</span></div>
|
|
<div class="line"><span class="preprocessor">#include "unused.h"</span></div>
|
|
<div class="line"></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">/*</span></div>
|
|
<div class="line"><span class="comment"> * These are defined only in compatibility mode (gl.h) not glcorearb.h</span></div>
|
|
<div class="line"><span class="comment"> */</span></div>
|
|
<div class="line"><span class="preprocessor">#if !defined( GL_LUMINANCE )</span></div>
|
|
<div class="line"><span class="preprocessor">#define GL_LUMINANCE 0x1909 </span><span class="comment">// deprecated</span></div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><span class="preprocessor">#if !defined( GL_LUMINANCE_ALPHA )</span></div>
|
|
<div class="line"><span class="preprocessor">#define GL_LUMINANCE_ALPHA 0x190A </span><span class="comment">// deprecated</span></div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><span class="preprocessor">#if !defined( GL_INTENSITY )</span></div>
|
|
<div class="line"><span class="preprocessor">#define GL_INTENSITY 0x8049 </span><span class="comment">// deprecated</span></div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">/*</span></div>
|
|
<div class="line"><span class="comment"> * N.B. As of Doxygen 1.9.6 non-class members must use fully qualified</span></div>
|
|
<div class="line"><span class="comment"> * names with @ref and @copy* references to classes. This means prefixing</span></div>
|
|
<div class="line"><span class="comment"> * a reference with the name of the (pseudo-)class of which it is a member.</span></div>
|
|
<div class="line"><span class="comment"> * We use @memberof to improve the index and toc for the doc for our</span></div>
|
|
<div class="line"><span class="comment"> * pseudo classes so we need to prefix. Since we don't want, e.g.,</span></div>
|
|
<div class="line"><span class="comment"> * ktxTexture1::ktxTexture1_GLUpload appearing in the documentation we have</span></div>
|
|
<div class="line"><span class="comment"> * to explicitly provide the link text making references very long-winded.</span></div>
|
|
<div class="line"><span class="comment"> * Sigh!</span></div>
|
|
<div class="line"><span class="comment"> */</span></div>
|
|
<div class="line"></div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="preprocessor">#define GL_GENERATE_MIPMAP 0x8191</span></div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="preprocessor">#define _CONTEXT_ES_PROFILE_BIT 0x4</span></div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="preprocessor">#define _NON_LEGACY_FORMATS 0x1 </span><span class="comment">/*< @internal Non-legacy sized formats are supported. */</span><span class="preprocessor"></span></div>
|
|
<div class="line"><span class="preprocessor">#define _LEGACY_FORMATS 0x2 </span><span class="comment">/*< @internal Legacy sized formats are supported. */</span><span class="preprocessor"></span><span class="preprocessor"></span></div>
|
|
<div class="line"><span class="preprocessor">#define _ALL_SIZED_FORMATS (_NON_LEGACY_FORMATS | _LEGACY_FORMATS)</span></div>
|
|
<div class="line"><span class="preprocessor">#define _NO_SIZED_FORMATS 0 </span><span class="comment">/*< @internal No sized formats are supported. */</span><span class="preprocessor"></span><span class="preprocessor"></span></div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="keyword">static</span> GLint contextProfile = 0;</div>
|
|
<div class="line"><span class="keyword">static</span> GLint sizedFormats = _ALL_SIZED_FORMATS;</div>
|
|
<div class="line"><span class="keyword">static</span> GLboolean supportsSwizzle = GL_TRUE;</div>
|
|
<div class="line"><span class="keyword">static</span> GLint R16Formats = _KTX_ALL_R16_FORMATS;</div>
|
|
<div class="line"><span class="keyword">static</span> GLboolean supportsSRGB = GL_TRUE;</div>
|
|
<div class="line"><span class="keyword">static</span> GLboolean supportsCubeMapArrays = GL_FALSE;</div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="keyword">static</span> GLboolean supportsMaxLevel = GL_FALSE;</div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="keyword">static</span> GLboolean</div>
|
|
<div class="line">hasExtension(<span class="keyword">const</span> <span class="keywordtype">char</span>* extension)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (gl.glGetStringi == NULL) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (strstr(glGetString(GL_EXTENSIONS), extension) != NULL) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> GL_TRUE;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> GL_FALSE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordtype">int</span> i, n;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glGetIntegerv(GL_NUM_EXTENSIONS, &n);</div>
|
|
<div class="line"> <span class="keywordflow">for</span> (i = 0; i < n; i++) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (strcmp((<span class="keyword">const</span> <span class="keywordtype">char</span>*)gl.glGetStringi(GL_EXTENSIONS, i), extension) == 0)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> GL_TRUE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">return</span> GL_FALSE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span></div>
|
|
<div class="line">discoverContextCapabilities(<span class="keywordtype">void</span>)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> GLint majorVersion = 1;</div>
|
|
<div class="line"> GLint minorVersion = 0;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (strstr(glGetString(GL_VERSION), <span class="stringliteral">"GL ES"</span>) != NULL)</div>
|
|
<div class="line"> contextProfile = _CONTEXT_ES_PROFILE_BIT;</div>
|
|
<div class="line"> <span class="comment">// MAJOR & MINOR only introduced in GL {,ES} 3.0</span></div>
|
|
<div class="line"> glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);</div>
|
|
<div class="line"> glGetIntegerv(GL_MINOR_VERSION, &minorVersion);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (glGetError() != GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="comment">// < v3.0; resort to the old-fashioned way.</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (contextProfile & _CONTEXT_ES_PROFILE_BIT)</div>
|
|
<div class="line"> sscanf(glGetString(GL_VERSION), <span class="stringliteral">"OpenGL ES %d.%d "</span>,</div>
|
|
<div class="line"> &majorVersion, &minorVersion);</div>
|
|
<div class="line"> <span class="keywordflow">else</span></div>
|
|
<div class="line"> sscanf(glGetString(GL_VERSION), <span class="stringliteral">"OpenGL %d.%d "</span>,</div>
|
|
<div class="line"> &majorVersion, &minorVersion);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (contextProfile & _CONTEXT_ES_PROFILE_BIT) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (majorVersion < 3) {</div>
|
|
<div class="line"> supportsSwizzle = GL_FALSE;</div>
|
|
<div class="line"> sizedFormats = _NO_SIZED_FORMATS;</div>
|
|
<div class="line"> R16Formats = _KTX_NO_R16_FORMATS;</div>
|
|
<div class="line"> supportsSRGB = GL_FALSE;</div>
|
|
<div class="line"> <span class="comment">// These things could be found by dlsym when, e.g. the same driver</span></div>
|
|
<div class="line"> <span class="comment">// supports ES1, ES2 and ES3. For all but Tex*3D, there's no</span></div>
|
|
<div class="line"> <span class="comment">// corresponding extension whose presence we could check. Just zero</span></div>
|
|
<div class="line"> <span class="comment">// the pointers to prevent use.</span></div>
|
|
<div class="line"> gl.glGetStringi = NULL;</div>
|
|
<div class="line"> gl.glCompressedTexImage1D = NULL;</div>
|
|
<div class="line"> gl.glTexStorage1D = NULL;</div>
|
|
<div class="line"> gl.glTexStorage2D = NULL;</div>
|
|
<div class="line"> gl.glTexStorage3D = NULL;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!hasExtension(<span class="stringliteral">"GL_OES_texture_3D"</span>)) {</div>
|
|
<div class="line"> gl.glCompressedTexImage3D = NULL;</div>
|
|
<div class="line"> gl.glCompressedTexSubImage3D = NULL;</div>
|
|
<div class="line"> gl.glTexImage3D = NULL;</div>
|
|
<div class="line"> gl.glTexSubImage3D = NULL;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (majorVersion < 2)</div>
|
|
<div class="line"> gl.glGenerateMipmap = NULL;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> sizedFormats = _NON_LEGACY_FORMATS;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (hasExtension(<span class="stringliteral">"GL_EXT_texture_cube_map_array"</span>)) {</div>
|
|
<div class="line"> supportsCubeMapArrays = GL_TRUE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> supportsMaxLevel = GL_TRUE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (hasExtension(<span class="stringliteral">"GL_OES_required_internalformat"</span>)) {</div>
|
|
<div class="line"> sizedFormats |= _ALL_SIZED_FORMATS;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="comment">// There are no OES extensions for sRGB textures or R16 formats.</span></div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="comment">// PROFILE_MASK was introduced in OpenGL 3.2.</span></div>
|
|
<div class="line"> <span class="comment">// Profiles: CONTEXT_CORE_PROFILE_BIT 0x1,</span></div>
|
|
<div class="line"> <span class="comment">// CONTEXT_COMPATIBILITY_PROFILE_BIT 0x2.</span></div>
|
|
<div class="line"> glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &contextProfile);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (glGetError() == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="comment">// >= 3.2</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (majorVersion == 3 && minorVersion < 3)</div>
|
|
<div class="line"> supportsSwizzle = GL_FALSE;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((contextProfile & GL_CONTEXT_CORE_PROFILE_BIT))</div>
|
|
<div class="line"> sizedFormats &= ~_LEGACY_FORMATS;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (majorVersion >= 4)</div>
|
|
<div class="line"> supportsCubeMapArrays = GL_TRUE;</div>
|
|
<div class="line"> supportsMaxLevel = GL_TRUE;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="comment">// < 3.2</span></div>
|
|
<div class="line"> contextProfile = GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;</div>
|
|
<div class="line"> supportsSwizzle = GL_FALSE;</div>
|
|
<div class="line"> <span class="comment">// sRGB textures introduced in 2.0</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (majorVersion < 2 && !hasExtension(<span class="stringliteral">"GL_EXT_texture_sRGB"</span>)) {</div>
|
|
<div class="line"> supportsSRGB = GL_FALSE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="comment">// R{,G]16 introduced in 3.0; R{,G}16_SNORM introduced in 3.1.</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (majorVersion == 3) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (minorVersion == 0)</div>
|
|
<div class="line"> R16Formats &= ~_KTX_R16_FORMATS_SNORM;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (minorVersion < 1) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (hasExtension(<span class="stringliteral">"GL_ARB_texture_query_levels"</span>))</div>
|
|
<div class="line"> supportsMaxLevel = GL_TRUE;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> supportsMaxLevel = GL_TRUE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hasExtension(<span class="stringliteral">"GL_ARB_texture_rg"</span>)) {</div>
|
|
<div class="line"> R16Formats &= ~_KTX_R16_FORMATS_SNORM;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> R16Formats = _KTX_NO_R16_FORMATS;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!supportsCubeMapArrays) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (hasExtension(<span class="stringliteral">"GL_ARB_texture_cube_map_array"</span>)) {</div>
|
|
<div class="line"> supportsCubeMapArrays = GL_TRUE;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="preprocessor">#if SUPPORT_LEGACY_FORMAT_CONVERSION</span><span class="preprocessor"></span></div>
|
|
<div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> convertFormat(GLenum target, GLenum* pFormat, GLenum* pInternalformat) {</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (*pFormat) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_ALPHA:</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> GLint swizzle[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED};</div>
|
|
<div class="line"> *pFormat = GL_RED;</div>
|
|
<div class="line"> glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (*pInternalformat) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_ALPHA:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_ALPHA4_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_ALPHA8_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_R8;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_ALPHA12_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_ALPHA16_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_R16;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE:</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_ONE};</div>
|
|
<div class="line"> *pFormat = GL_RED;</div>
|
|
<div class="line"> glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (*pInternalformat) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE4_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE8_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_R8;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE12_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE16_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_R16;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><span class="preprocessor">#if 0</span></div>
|
|
<div class="line"> <span class="comment">// XXX Must avoid setting TEXTURE_SWIZZLE in these cases</span></div>
|
|
<div class="line"> <span class="comment">// XXX Must manually swizzle.</span></div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_SLUMINANCE:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_SLUMINANCE8:</div>
|
|
<div class="line"> *pInternalformat = GL_SRGB8;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE_ALPHA:</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_GREEN};</div>
|
|
<div class="line"> *pFormat = GL_RG;</div>
|
|
<div class="line"> glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (*pInternalformat) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE_ALPHA:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE4_ALPHA4_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE6_ALPHA2_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE8_ALPHA8_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_RG8;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE12_ALPHA4_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE12_ALPHA12_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_LUMINANCE16_ALPHA16_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_RG16;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><span class="preprocessor">#if 0</span></div>
|
|
<div class="line"> <span class="comment">// XXX Must avoid setting TEXTURE_SWIZZLE in these cases</span></div>
|
|
<div class="line"> <span class="comment">// XXX Must manually swizzle.</span></div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_SLUMINANCE_ALPHA_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_SLUMINANCE8_ALPHA8_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_SRGB8_ALPHA8;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_INTENSITY:</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> GLint swizzle[] = {GL_RED, GL_RED, GL_RED, GL_RED};</div>
|
|
<div class="line"> *pFormat = GL_RED;</div>
|
|
<div class="line"> glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (*pInternalformat) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_INTENSITY:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_INTENSITY4_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_INTENSITY8_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_R8;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_INTENSITY12_EXT:</div>
|
|
<div class="line"> <span class="keywordflow">case</span> GL_INTENSITY16_EXT:</div>
|
|
<div class="line"> *pInternalformat = GL_R16;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">default</span>:</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"><span class="preprocessor">#endif </span><span class="comment">/* SUPPORT_LEGACY_FORMAT_CONVERSION */</span><span class="preprocessor"></span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>ktx_glformatinfo {</div>
|
|
<div class="line"> ktx_uint32_t glFormat;</div>
|
|
<div class="line"> ktx_uint32_t glInternalformat;</div>
|
|
<div class="line"> ktx_uint32_t glBaseInternalformat;</div>
|
|
<div class="line"> ktx_uint32_t glType;</div>
|
|
<div class="line">} ktx_glformatinfo;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">/* [cbdata] */</span></div>
|
|
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>ktx_cbdata {</div>
|
|
<div class="line"> GLenum glTarget;</div>
|
|
<div class="line"> GLenum glFormat;</div>
|
|
<div class="line"> GLenum glInternalformat;</div>
|
|
<div class="line"> GLenum glType;</div>
|
|
<div class="line"> GLenum glError;</div>
|
|
<div class="line"> GLuint numLayers;</div>
|
|
<div class="line">} ktx_cbdata;</div>
|
|
<div class="line"><span class="comment">/* [cbdata] */</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><span class="comment">/* [imageCallbacks] */</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a id="_a0" name="_a0"></a><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">texImage1DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(faceLodSize);</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> UNUSED(height);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glTexImage1D != NULL);</div>
|
|
<div class="line"> gl.glTexImage1D(cbData-><a id="a1" name="a1"></a>glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData-><a id="a2" name="a2"></a>glInternalformat, width, 0,</div>
|
|
<div class="line"> cbData-><a id="a3" name="a3"></a>glFormat, cbData-><a id="a4" name="a4"></a>glType, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData-><a id="a5" name="a5"></a>glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a id="_a6" name="_a6"></a><a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a id="_a7" name="_a7"></a><a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">compressedTexImage1DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> UNUSED(height);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (faceLodSize > UINT32_MAX)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a id="_a8" name="_a8"></a><a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// Too big for OpenGL {,ES}.</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glCompressedTexImage1D != NULL);</div>
|
|
<div class="line"> gl.glCompressedTexImage1D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width, 0,</div>
|
|
<div class="line"> (ktx_uint32_t)faceLodSize, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">texImage2DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> UNUSED(faceLodSize);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glTexImage2D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width,</div>
|
|
<div class="line"> cbData-><a id="a9" name="a9"></a>numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,</div>
|
|
<div class="line"> cbData->glFormat, cbData->glType, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">compressedTexImage2DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> GLenum glerror;</div>
|
|
<div class="line"> <a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a> result;</div>
|
|
<div class="line"> UNUSED(depth);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (faceLodSize > UINT32_MAX)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// Too big for OpenGL {,ES}.</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// It is simpler to just attempt to load the format, rather than divine</span></div>
|
|
<div class="line"> <span class="comment">// which formats are supported by the implementation. In the event of an</span></div>
|
|
<div class="line"> <span class="comment">// error, software unpacking can be attempted.</span></div>
|
|
<div class="line"> glCompressedTexImage2D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat, width,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers,</div>
|
|
<div class="line"> 0,</div>
|
|
<div class="line"> (ktx_uint32_t)faceLodSize, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glerror = glGetError();</div>
|
|
<div class="line"><span class="preprocessor">#if SUPPORT_SOFTWARE_ETC_UNPACK</span></div>
|
|
<div class="line"> <span class="comment">// Renderion is returning INVALID_VALUE. Oops!!</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((glerror == GL_INVALID_ENUM || glerror == GL_INVALID_VALUE)</div>
|
|
<div class="line"> && (cbData->glInternalformat == GL_ETC1_RGB8_OES</div>
|
|
<div class="line"> || (cbData->glInternalformat >= GL_COMPRESSED_R11_EAC</div>
|
|
<div class="line"> && cbData->glInternalformat <= GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)</div>
|
|
<div class="line"> ))</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> GLubyte* unpacked;</div>
|
|
<div class="line"> GLenum format, internalformat, type;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> result = _ktxUnpackETC((GLubyte*)pixels, cbData->glInternalformat,</div>
|
|
<div class="line"> width, height, &unpacked,</div>
|
|
<div class="line"> &format, &internalformat,</div>
|
|
<div class="line"> &type, R16Formats, supportsSRGB);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result != <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!(sizedFormats & _NON_LEGACY_FORMATS)) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (internalformat == GL_RGB8)</div>
|
|
<div class="line"> internalformat = GL_RGB;</div>
|
|
<div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> (internalformat == GL_RGBA8)</div>
|
|
<div class="line"> internalformat = GL_RGBA;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> glTexImage2D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> internalformat, width,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)height : cbData->numLayers, 0,</div>
|
|
<div class="line"> format, type, unpacked);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> free(unpacked);</div>
|
|
<div class="line"> glerror = glGetError();</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glerror) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">texImage3DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> UNUSED(faceLodSize);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glTexImage3D != NULL);</div>
|
|
<div class="line"> gl.glTexImage3D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat,</div>
|
|
<div class="line"> width, height,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,</div>
|
|
<div class="line"> 0,</div>
|
|
<div class="line"> cbData->glFormat, cbData->glType, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"> </div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">compressedTexImage3DCallback(<span class="keywordtype">int</span> miplevel, <span class="keywordtype">int</span> face,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> width, <span class="keywordtype">int</span> height,</div>
|
|
<div class="line"> <span class="keywordtype">int</span> depth,</div>
|
|
<div class="line"> ktx_uint64_t faceLodSize,</div>
|
|
<div class="line"> <span class="keywordtype">void</span>* pixels, <span class="keywordtype">void</span>* userdata)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> ktx_cbdata* cbData = (ktx_cbdata*)userdata;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (faceLodSize > UINT32_MAX)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// Too big for OpenGL {,ES}.</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(gl.glCompressedTexImage3D != NULL);</div>
|
|
<div class="line"> gl.glCompressedTexImage3D(cbData->glTarget + face, miplevel,</div>
|
|
<div class="line"> cbData->glInternalformat,</div>
|
|
<div class="line"> width, height,</div>
|
|
<div class="line"> cbData->numLayers == 0 ? (GLuint)depth : cbData->numLayers,</div>
|
|
<div class="line"> 0,</div>
|
|
<div class="line"> (ktx_uint32_t)faceLodSize, pixels);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> ((cbData->glError = glGetError()) == GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line">}</div>
|
|
<div class="line"><span class="comment">/* [imageCallbacks] */</span></div>
|
|
<div class="line"></div>
|
|
<div class="line"><span class="comment">/* [loadGLTexture] */</span></div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">ktxTexture_GLUploadPrivate(<a id="_a10" name="_a10"></a><a class="code hl_class" href="structktxTexture.html">ktxTexture</a>* This, ktx_glformatinfo* formatInfo,</div>
|
|
<div class="line"> GLuint* pTexture, GLenum* pTarget, GLenum* pGlerror)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> GLuint texname;</div>
|
|
<div class="line"> GLenum target = GL_TEXTURE_2D;</div>
|
|
<div class="line"> <span class="keywordtype">int</span> texnameUser;</div>
|
|
<div class="line"> <a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a> result = <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> ktx_cbdata cbData;</div>
|
|
<div class="line"> PFNKTXITERCB iterCb = NULL;</div>
|
|
<div class="line"> <span class="keywordtype">int</span> dimensions;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (pGlerror)</div>
|
|
<div class="line"> *pGlerror = GL_NO_ERROR;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> assert(This && pTarget);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (contextProfile == 0)</div>
|
|
<div class="line"> discoverContextCapabilities();</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> texnameUser = pTexture && *pTexture;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (texnameUser) {</div>
|
|
<div class="line"> texname = *pTexture;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> glGenTextures(1, &texname);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> cbData.glFormat = formatInfo-><a id="a11" name="a11"></a>glFormat;</div>
|
|
<div class="line"> cbData.glInternalformat = formatInfo-><a id="a12" name="a12"></a>glInternalformat;</div>
|
|
<div class="line"> cbData.glType = formatInfo-><a id="a13" name="a13"></a>glType;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> dimensions = This-><a id="a14" name="a14"></a><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a>;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a id="a15" name="a15"></a><a class="code hl_variable" href="structktxTexture.html#a9b5ca8c2e3fd76d8b427928775289078">isArray</a>) {</div>
|
|
<div class="line"> dimensions += 1;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a id="a16" name="a16"></a><a class="code hl_variable" href="structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068">numFaces</a> == 6) {</div>
|
|
<div class="line"> <span class="comment">/* ktxCheckHeader1_ should have caught this. */</span></div>
|
|
<div class="line"> assert(This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a> == 2);</div>
|
|
<div class="line"> target = GL_TEXTURE_CUBE_MAP_ARRAY;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 1: target = GL_TEXTURE_1D_ARRAY; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 2: target = GL_TEXTURE_2D_ARRAY; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="comment">/* _ktxCheckHeader should have caught this. */</span></div>
|
|
<div class="line"> <span class="keywordflow">default</span>: assert(KTX_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> cbData.numLayers = This-><a id="a17" name="a17"></a>numLayers;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068">numFaces</a> == 6) {</div>
|
|
<div class="line"> <span class="comment">/* ktxCheckHeader1_ should have caught this. */</span></div>
|
|
<div class="line"> assert(This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a> == 2);</div>
|
|
<div class="line"> target = GL_TEXTURE_CUBE_MAP;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (This-><a class="code hl_variable" href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">numDimensions</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 1: target = GL_TEXTURE_1D; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 2: target = GL_TEXTURE_2D; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 3: target = GL_TEXTURE_3D; <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="comment">/* _ktxCheckHeader shold have caught this. */</span></div>
|
|
<div class="line"> <span class="keywordflow">default</span>: assert(KTX_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> cbData.numLayers = 0;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_1D &&</div>
|
|
<div class="line"> ((This-><a id="a18" name="a18"></a><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glCompressedTexImage1D == NULL)) ||</div>
|
|
<div class="line"> (!This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glTexImage1D == NULL))))</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a id="_a19" name="_a19"></a><a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* Reject 3D texture if unsupported. */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_3D &&</div>
|
|
<div class="line"> ((This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glCompressedTexImage3D == NULL)) ||</div>
|
|
<div class="line"> (!This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a> && (gl.glTexImage3D == NULL))))</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* Reject cube map arrays if not supported. */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_CUBE_MAP_ARRAY && !supportsCubeMapArrays) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* XXX Need to reject other array textures & cube maps if not supported. */</span></div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">switch</span> (dimensions) {</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 1:</div>
|
|
<div class="line"> iterCb = This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a></div>
|
|
<div class="line"> ? compressedTexImage1DCallback : texImage1DCallback;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 2:</div>
|
|
<div class="line"> iterCb = This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a></div>
|
|
<div class="line"> ? compressedTexImage2DCallback : texImage2DCallback;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">case</span> 3:</div>
|
|
<div class="line"> iterCb = This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a></div>
|
|
<div class="line"> ? compressedTexImage3DCallback : texImage3DCallback;</div>
|
|
<div class="line"> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"> <span class="keywordflow">default</span>:</div>
|
|
<div class="line"> assert(KTX_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> glBindTexture(target, texname);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">// Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a id="a20" name="a20"></a><a class="code hl_variable" href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">generateMipmaps</a> && (gl.glGenerateMipmap == NULL)) {</div>
|
|
<div class="line"> glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!This-><a class="code hl_variable" href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">generateMipmaps</a> && supportsMaxLevel)</div>
|
|
<div class="line"> glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, This-><a id="a21" name="a21"></a><a class="code hl_variable" href="structktxTexture.html#a782126a62c27ee8660a14565b906694c">numLevels</a> - 1);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (target == GL_TEXTURE_CUBE_MAP) {</div>
|
|
<div class="line"> cbData.glTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> cbData.glTarget = target;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!This-><a class="code hl_variable" href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">isCompressed</a>) {</div>
|
|
<div class="line"><span class="preprocessor">#if SUPPORT_LEGACY_FORMAT_CONVERSION</span></div>
|
|
<div class="line"> <span class="comment">// If sized legacy formats are supported there is no need to convert.</span></div>
|
|
<div class="line"> <span class="comment">// If only unsized formats are supported, there is no point in</span></div>
|
|
<div class="line"> <span class="comment">// converting as the modern formats aren't supported either.</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (sizedFormats == _NON_LEGACY_FORMATS && supportsSwizzle) {</div>
|
|
<div class="line"> convertFormat(target, &cbData.glFormat, &cbData.glInternalformat);</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sizedFormats == _NO_SIZED_FORMATS)</div>
|
|
<div class="line"> cbData.glInternalformat = formatInfo-><a id="a22" name="a22"></a>glBaseInternalformat;</div>
|
|
<div class="line"><span class="preprocessor">#else</span></div>
|
|
<div class="line"> <span class="comment">// When no sized formats are supported, or legacy sized formats are not</span></div>
|
|
<div class="line"> <span class="comment">// supported, must change internal format.</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (sizedFormats == _NO_SIZED_FORMATS</div>
|
|
<div class="line"> || (!(sizedFormats & _LEGACY_FORMATS) &&</div>
|
|
<div class="line"> (formatInfo->glBaseInternalformat == GL_ALPHA</div>
|
|
<div class="line"> || formatInfo->glBaseInternalformat == GL_LUMINANCE</div>
|
|
<div class="line"> || formatInfo->glBaseInternalformat == GL_LUMINANCE_ALPHA</div>
|
|
<div class="line"> || formatInfo->glBaseInternalformat == GL_INTENSITY))) {</div>
|
|
<div class="line"> cbData.glInternalformat = formatInfo->glBaseInternalformat;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"><span class="preprocessor">#endif</span></div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (ktxTexture_isActiveStream(<a class="code hl_class" href="structktxTexture.html">ktxTexture</a>(This)))</div>
|
|
<div class="line"> result = <a id="a23" name="a23"></a><a class="code hl_define" href="ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514">ktxTexture_IterateLoadLevelFaces</a>(This, iterCb, &cbData);</div>
|
|
<div class="line"> <span class="keywordflow">else</span></div>
|
|
<div class="line"> result = ktxTexture_IterateLevelFaces(This, iterCb, &cbData);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* GL errors are the only reason for failure. */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result != <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a> && cbData.glError != GL_NO_ERROR) {</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (pGlerror)</div>
|
|
<div class="line"> *pGlerror = cbData.glError;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result == <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>)</div>
|
|
<div class="line"> {</div>
|
|
<div class="line"> <span class="comment">// Prefer glGenerateMipmaps over GL_GENERATE_MIPMAP</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a class="code hl_variable" href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">generateMipmaps</a> && gl.glGenerateMipmap) {</div>
|
|
<div class="line"> gl.glGenerateMipmap(target);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> *pTarget = target;</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (pTexture) {</div>
|
|
<div class="line"> *pTexture = texname;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!texnameUser) {</div>
|
|
<div class="line"> glDeleteTextures(1, &texname);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line">}</div>
|
|
<div class="line"><span class="comment">/* [loadGLTexture] */</span></div>
|
|
<div class="line"></div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">ktxTexture1_GLUpload(<a id="_a24" name="_a24"></a><a class="code hl_class" href="structktxTexture1.html">ktxTexture1</a>* This, GLuint* pTexture, GLenum* pTarget,</div>
|
|
<div class="line"> GLenum* pGlerror)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> GLint previousUnpackAlignment;</div>
|
|
<div class="line"> <a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a> result = <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> ktx_glformatinfo formatInfo;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!This) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a id="_a25" name="_a25"></a><a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f">KTX_INVALID_VALUE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!pTarget) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f">KTX_INVALID_VALUE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> result = <a id="a26" name="a26"></a><a class="code hl_function" href="group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6">ktxLoadOpenGL</a>(NULL);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result != <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="comment">/* KTX 1 files require an unpack alignment of 4 */</span></div>
|
|
<div class="line"> glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousUnpackAlignment);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (previousUnpackAlignment != <a id="_a27" name="_a27"></a><a class="code hl_define" href="ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a">KTX_GL_UNPACK_ALIGNMENT</a>) {</div>
|
|
<div class="line"> glPixelStorei(GL_UNPACK_ALIGNMENT, <a class="code hl_define" href="ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a">KTX_GL_UNPACK_ALIGNMENT</a>);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> formatInfo.glFormat = This-><a id="a28" name="a28"></a><a class="code hl_variable" href="structktxTexture1.html#a05fa4fecc2735f68d34651a62493ecd9">glFormat</a>;</div>
|
|
<div class="line"> formatInfo.glInternalformat = This-><a id="a29" name="a29"></a><a class="code hl_variable" href="structktxTexture1.html#a1318d73f800ff61d045b740331939596">glInternalformat</a>;</div>
|
|
<div class="line"> formatInfo.glBaseInternalformat = This-><a id="a30" name="a30"></a><a class="code hl_variable" href="structktxTexture1.html#aaadefe13bf76c26cb921afa52fb29192">glBaseInternalformat</a>;</div>
|
|
<div class="line"> formatInfo.glType = This-><a id="a31" name="a31"></a><a class="code hl_variable" href="structktxTexture1.html#ac8a870c675f1e36c456c9de2e3ac9855">glType</a>;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> result = ktxTexture_GLUploadPrivate(<a class="code hl_class" href="structktxTexture.html">ktxTexture</a>(This), &formatInfo,</div>
|
|
<div class="line"> pTexture, pTarget, pGlerror);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* restore previous GL state */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (previousUnpackAlignment != <a class="code hl_define" href="ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a">KTX_GL_UNPACK_ALIGNMENT</a>) {</div>
|
|
<div class="line"> glPixelStorei(GL_UNPACK_ALIGNMENT, previousUnpackAlignment);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line">}</div>
|
|
<div class="line"></div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">ktxTexture2_GLUpload(<a id="_a32" name="_a32"></a><a class="code hl_class" href="structktxTexture2.html">ktxTexture2</a>* This, GLuint* pTexture, GLenum* pTarget,</div>
|
|
<div class="line"> GLenum* pGlerror)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> GLint previousUnpackAlignment;</div>
|
|
<div class="line"> <a id="_a33" name="_a33"></a><a class="code hl_enumeration" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116c">ktx_error_code_e</a> result = <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>;</div>
|
|
<div class="line"> ktx_glformatinfo formatInfo;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!This) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f">KTX_INVALID_VALUE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (!pTarget) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f">KTX_INVALID_VALUE</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> result = <a class="code hl_function" href="group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6">ktxLoadOpenGL</a>(NULL);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (result != <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cafdb7a07b23399df43e1ecf161963cf98">KTX_SUCCESS</a>) {</div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a id="a34" name="a34"></a>vkFormat != VK_FORMAT_UNDEFINED) {</div>
|
|
<div class="line"> formatInfo.glInternalformat =</div>
|
|
<div class="line"> vkFormat2glInternalFormat(This->vkFormat);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (formatInfo.glInternalformat == GL_INVALID_VALUE) {</div>
|
|
<div class="line"> <span class="comment">// TODO Check for mapping metadata. If none</span></div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> <span class="comment">// TODO: Check DFD for ASTC HDR or 3D or RGB[DEM] and figure out format.</span></div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>; <span class="comment">// BasisU textures must be transcoded</span></div>
|
|
<div class="line"> <span class="comment">// before upload.</span></div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a id="a35" name="a35"></a>isCompressed) {</div>
|
|
<div class="line"> <span class="comment">/* Unused. */</span></div>
|
|
<div class="line"> formatInfo.glFormat = GL_INVALID_VALUE;</div>
|
|
<div class="line"> formatInfo.glType = GL_INVALID_VALUE;</div>
|
|
<div class="line"> formatInfo.glBaseInternalformat = GL_INVALID_VALUE;</div>
|
|
<div class="line"> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"> formatInfo.glFormat = vkFormat2glFormat(This->vkFormat);</div>
|
|
<div class="line"> formatInfo.glType = vkFormat2glType(This->vkFormat);</div>
|
|
<div class="line"> formatInfo.glBaseInternalformat = formatInfo.glInternalformat;</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">if</span> (formatInfo.glFormat == GL_INVALID_VALUE || formatInfo.glType == GL_INVALID_VALUE)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> <a class="code hl_enumvalue" href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a>;</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> <span class="comment">/* KTX 2 files require an unpack alignment of 1. OGL default is 4. */</span></div>
|
|
<div class="line"> glGetIntegerv(GL_UNPACK_ALIGNMENT, &previousUnpackAlignment);</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (previousUnpackAlignment != 1) {</div>
|
|
<div class="line"> glPixelStorei(GL_UNPACK_ALIGNMENT, 1);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> result = ktxTexture_GLUploadPrivate(<a class="code hl_class" href="structktxTexture.html">ktxTexture</a>(This), &formatInfo,</div>
|
|
<div class="line"> pTexture, pTarget, pGlerror);</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="comment">/* restore previous GL state */</span></div>
|
|
<div class="line"> <span class="keywordflow">if</span> (previousUnpackAlignment != 1) {</div>
|
|
<div class="line"> glPixelStorei(GL_UNPACK_ALIGNMENT, previousUnpackAlignment);</div>
|
|
<div class="line"> }</div>
|
|
<div class="line"> </div>
|
|
<div class="line"> <span class="keywordflow">return</span> result;</div>
|
|
<div class="line">}</div>
|
|
<div class="line"></div>
|
|
<div class="line"><a class="code hl_define" href="ktx_8h.html#ad2efa40e38ebae48371375db92d34eaa">KTX_error_code</a></div>
|
|
<div class="line">ktxTexture_GLUpload(<a class="code hl_class" href="structktxTexture.html">ktxTexture</a>* This, GLuint* pTexture, GLenum* pTarget,</div>
|
|
<div class="line"> GLenum* pGlerror)</div>
|
|
<div class="line">{</div>
|
|
<div class="line"> <span class="keywordflow">if</span> (This-><a id="a36" name="a36"></a><a class="code hl_variable" href="structktxTexture.html#a150d3ff33a9fa83ecba8e3fdda7ec972">classId</a> == ktxTexture2_c)</div>
|
|
<div class="line"> <span class="keywordflow">return</span> ktxTexture2_GLUpload((<a class="code hl_class" href="structktxTexture2.html">ktxTexture2</a>*)This, pTexture, pTarget,</div>
|
|
<div class="line"> pGlerror);</div>
|
|
<div class="line"> <span class="keywordflow">else</span></div>
|
|
<div class="line"> <span class="keywordflow">return</span> ktxTexture1_GLUpload((<a class="code hl_class" href="structktxTexture1.html">ktxTexture1</a>*)This, pTexture, pTarget,</div>
|
|
<div class="line"> pGlerror);</div>
|
|
<div class="line">}</div>
|
|
<div class="line"></div>
|
|
<div class="ttc" id="agroup__ktx__glloader_html_gada67f60796793d1ed9eb1f3f2d61d4a6"><div class="ttname"><a href="group__ktx__glloader.html#gada67f60796793d1ed9eb1f3f2d61d4a6">ktxLoadOpenGL</a></div><div class="ttdeci">KTX_API KTX_error_code KTX_APIENTRY ktxLoadOpenGL(PFNGLGETPROCADDRESS pfnGLGetProcAddress)</div><div class="ttdoc">Load pointers for the GL functions used by the ktxTexture*_GLUpload functions.</div><div class="ttdef"><b>Definition</b> gl_funcs.c:216</div></div>
|
|
<div class="ttc" id="aktx_8h_html_a7780d97ec4de6aa30c4726fb71e3116c"><div class="ttname"><a href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116c">ktx_error_code_e</a></div><div class="ttdeci">ktx_error_code_e</div><div class="ttdoc">Error codes returned by library functions.</div><div class="ttdef"><b>Definition</b> ktx.h:169</div></div>
|
|
<div class="ttc" id="aktx_8h_html_a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f"><div class="ttname"><a href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca7da41bb3195d6cc93a513ac18bc91e4f">KTX_INVALID_VALUE</a></div><div class="ttdeci">@ KTX_INVALID_VALUE</div><div class="ttdef"><b>Definition</b> ktx.h:181</div></div>
|
|
<div class="ttc" id="aktx_8h_html_a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf"><div class="ttname"><a href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116ca89736f14efecf057c2d5a35342ab84cf">KTX_GL_ERROR</a></div><div class="ttdeci">@ KTX_GL_ERROR</div><div class="ttdef"><b>Definition</b> ktx.h:179</div></div>
|
|
<div class="ttc" id="aktx_8h_html_a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d"><div class="ttname"><a href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116cad3d82ba3467063bec92486a94a38d21d">KTX_UNSUPPORTED_TEXTURE_TYPE</a></div><div class="ttdeci">@ KTX_UNSUPPORTED_TEXTURE_TYPE</div><div class="ttdef"><b>Definition</b> ktx.h:186</div></div>
|
|
<div class="ttc" id="aktx_8h_html_a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a"><div class="ttname"><a href="ktx_8h.html#a7780d97ec4de6aa30c4726fb71e3116caf20c350e21ca603f3ffb2bc46235369a">KTX_INVALID_OPERATION</a></div><div class="ttdeci">@ KTX_INVALID_OPERATION</div><div class="ttdef"><b>Definition</b> ktx.h:180</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_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="aktx_8h_html_ad5dd0ebf8aaef8c150603bd95d61b94a"><div class="ttname"><a href="ktx_8h.html#ad5dd0ebf8aaef8c150603bd95d61b94a">KTX_GL_UNPACK_ALIGNMENT</a></div><div class="ttdeci">#define KTX_GL_UNPACK_ALIGNMENT</div><div class="ttdoc">Required unpack alignment.</div><div class="ttdef"><b>Definition</b> ktx.h:159</div></div>
|
|
<div class="ttc" id="aktx_8h_html_ae5fd56d78ae250ac5f7511d8041ec514"><div class="ttname"><a href="ktx_8h.html#ae5fd56d78ae250ac5f7511d8041ec514">ktxTexture_IterateLoadLevelFaces</a></div><div class="ttdeci">#define ktxTexture_IterateLoadLevelFaces(This, iterCb, userdata)</div><div class="ttdoc">Helper for calling the IterateLoadLevelFaces virtual method of a ktxTexture.</div><div class="ttdef"><b>Definition</b> ktx.h:585</div></div>
|
|
<div class="ttc" id="astructktxTexture1_html"><div class="ttname"><a href="structktxTexture1.html">ktxTexture1</a></div><div class="ttdoc">Class representing a KTX version 1 format texture.</div><div class="ttdef"><b>Definition</b> ktx.h:667</div></div>
|
|
<div class="ttc" id="astructktxTexture1_html_a05fa4fecc2735f68d34651a62493ecd9"><div class="ttname"><a href="structktxTexture1.html#a05fa4fecc2735f68d34651a62493ecd9">ktxTexture1::glFormat</a></div><div class="ttdeci">ktx_uint32_t glFormat</div><div class="ttdef"><b>Definition</b> ktx.h:669</div></div>
|
|
<div class="ttc" id="astructktxTexture1_html_a1318d73f800ff61d045b740331939596"><div class="ttname"><a href="structktxTexture1.html#a1318d73f800ff61d045b740331939596">ktxTexture1::glInternalformat</a></div><div class="ttdeci">ktx_uint32_t glInternalformat</div><div class="ttdef"><b>Definition</b> ktx.h:670</div></div>
|
|
<div class="ttc" id="astructktxTexture1_html_aaadefe13bf76c26cb921afa52fb29192"><div class="ttname"><a href="structktxTexture1.html#aaadefe13bf76c26cb921afa52fb29192">ktxTexture1::glBaseInternalformat</a></div><div class="ttdeci">ktx_uint32_t glBaseInternalformat</div><div class="ttdef"><b>Definition</b> ktx.h:672</div></div>
|
|
<div class="ttc" id="astructktxTexture1_html_ac8a870c675f1e36c456c9de2e3ac9855"><div class="ttname"><a href="structktxTexture1.html#ac8a870c675f1e36c456c9de2e3ac9855">ktxTexture1::glType</a></div><div class="ttdeci">ktx_uint32_t glType</div><div class="ttdef"><b>Definition</b> ktx.h:674</div></div>
|
|
<div class="ttc" id="astructktxTexture2_html"><div class="ttname"><a href="structktxTexture2.html">ktxTexture2</a></div><div class="ttdoc">Class representing a KTX version 2 format texture.</div><div class="ttdef"><b>Definition</b> ktx.h:706</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_a150d3ff33a9fa83ecba8e3fdda7ec972"><div class="ttname"><a href="structktxTexture.html#a150d3ff33a9fa83ecba8e3fdda7ec972">ktxTexture::classId</a></div><div class="ttdeci">class_id classId</div><div class="ttdoc">Identify the class type.</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
|
|
<div class="ttc" id="astructktxTexture_html_a2e4800f49e90dc42fc15609a13f66650"><div class="ttname"><a href="structktxTexture.html#a2e4800f49e90dc42fc15609a13f66650">ktxTexture::isCompressed</a></div><div class="ttdeci">ktx_bool_t isCompressed</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
|
|
<div class="ttc" id="astructktxTexture_html_a3a4bc2fa2e41bcec0bdb265505af0068"><div class="ttname"><a href="structktxTexture.html#a3a4bc2fa2e41bcec0bdb265505af0068">ktxTexture::numFaces</a></div><div class="ttdeci">ktx_uint32_t numFaces</div><div class="ttdoc">Number of faces: 6 for cube maps, 1 otherwise.</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
|
|
<div class="ttc" id="astructktxTexture_html_a3c48573960eb90b1e38cc70457d2cda1"><div class="ttname"><a href="structktxTexture.html#a3c48573960eb90b1e38cc70457d2cda1">ktxTexture::numDimensions</a></div><div class="ttdeci">ktx_uint32_t numDimensions</div><div class="ttdoc">Number of dimensions in the texture: 1, 2 or 3.</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
|
|
<div class="ttc" id="astructktxTexture_html_a782126a62c27ee8660a14565b906694c"><div class="ttname"><a href="structktxTexture.html#a782126a62c27ee8660a14565b906694c">ktxTexture::numLevels</a></div><div class="ttdeci">ktx_uint32_t numLevels</div><div class="ttdoc">Number of mip levels in the texture.</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
|
|
<div class="ttc" id="astructktxTexture_html_a9b5ca8c2e3fd76d8b427928775289078"><div class="ttname"><a href="structktxTexture.html#a9b5ca8c2e3fd76d8b427928775289078">ktxTexture::isArray</a></div><div class="ttdeci">ktx_bool_t isArray</div><div class="ttdef"><b>Definition</b> ktx.h:288</div></div>
|
|
<div class="ttc" id="astructktxTexture_html_a9c26601222e6a037f7dbae7b61b18fd0"><div class="ttname"><a href="structktxTexture.html#a9c26601222e6a037f7dbae7b61b18fd0">ktxTexture::generateMipmaps</a></div><div class="ttdeci">ktx_bool_t generateMipmaps</div><div class="ttdef"><b>Definition</b> ktx.h:288</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>
|