summaryrefslogtreecommitdiff
path: root/thirdparty/basis_universal/encoder/basisu_opencl.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/basis_universal/encoder/basisu_opencl.h')
-rw-r--r--thirdparty/basis_universal/encoder/basisu_opencl.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/thirdparty/basis_universal/encoder/basisu_opencl.h b/thirdparty/basis_universal/encoder/basisu_opencl.h
new file mode 100644
index 0000000000..4194a08418
--- /dev/null
+++ b/thirdparty/basis_universal/encoder/basisu_opencl.h
@@ -0,0 +1,143 @@
+// basisu_opencl.h
+// Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved.
+//
+// Note: Undefine or set BASISU_SUPPORT_OPENCL to 0 to completely OpenCL support.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#pragma once
+#include "../transcoder/basisu.h"
+#include "basisu_enc.h"
+#include "basisu_etc.h"
+
+namespace basisu
+{
+ bool opencl_init(bool force_serialization);
+ void opencl_deinit();
+ bool opencl_is_available();
+
+ struct opencl_context;
+
+ // Each thread calling OpenCL should have its own opencl_context_ptr. This corresponds to a OpenCL command queue. (Confusingly, we only use a single OpenCL device "context".)
+ typedef opencl_context* opencl_context_ptr;
+
+ opencl_context_ptr opencl_create_context();
+ void opencl_destroy_context(opencl_context_ptr context);
+
+#pragma pack(push, 1)
+ struct cl_pixel_block
+ {
+ color_rgba m_pixels[16]; // [y*4+x]
+ };
+#pragma pack(pop)
+
+ // Must match BASISU_ETC1_CLUSTER_FIT_ORDER_TABLE_SIZE
+ const uint32_t OPENCL_ENCODE_ETC1S_MAX_PERMS = 165;
+
+ bool opencl_set_pixel_blocks(opencl_context_ptr pContext, uint32_t total_blocks, const cl_pixel_block* pPixel_blocks);
+
+ bool opencl_encode_etc1s_blocks(opencl_context_ptr pContext, etc_block* pOutput_blocks, bool perceptual, uint32_t total_perms);
+
+ // opencl_encode_etc1s_pixel_clusters
+
+#pragma pack(push, 1)
+ struct cl_pixel_cluster
+ {
+ uint64_t m_total_pixels;
+ uint64_t m_first_pixel_index;
+ };
+#pragma pack(pop)
+
+ bool opencl_encode_etc1s_pixel_clusters(
+ opencl_context_ptr pContext,
+ etc_block* pOutput_blocks,
+ uint32_t total_clusters,
+ const cl_pixel_cluster *pClusters,
+ uint64_t total_pixels,
+ const color_rgba *pPixels,
+ const uint32_t *pPixel_weights,
+ bool perceptual, uint32_t total_perms);
+
+ // opencl_refine_endpoint_clusterization
+
+#pragma pack(push, 1)
+ struct cl_block_info_struct
+ {
+ uint16_t m_first_cluster_ofs;
+ uint16_t m_num_clusters;
+ uint16_t m_cur_cluster_index;
+ uint8_t m_cur_cluster_etc_inten;
+ };
+
+ struct cl_endpoint_cluster_struct
+ {
+ color_rgba m_unscaled_color;
+ uint8_t m_etc_inten;
+ uint16_t m_cluster_index;
+ };
+#pragma pack(pop)
+
+ bool opencl_refine_endpoint_clusterization(
+ opencl_context_ptr pContext,
+ const cl_block_info_struct *pPixel_block_info,
+ uint32_t total_clusters,
+ const cl_endpoint_cluster_struct *pCluster_info,
+ const uint32_t *pSorted_block_indices,
+ uint32_t* pOutput_cluster_indices,
+ bool perceptual);
+
+ // opencl_find_optimal_selector_clusters_for_each_block
+
+#pragma pack(push, 1)
+ struct fosc_selector_struct
+ {
+ uint32_t m_packed_selectors; // 4x4 grid of 2-bit selectors
+ };
+
+ struct fosc_block_struct
+ {
+ color_rgba m_etc_color5_inten; // unscaled 5-bit block color in RGB, alpha has block's intensity index
+ uint32_t m_first_selector; // offset into selector table
+ uint32_t m_num_selectors; // number of selectors to check
+ };
+
+ struct fosc_param_struct
+ {
+ uint32_t m_total_blocks;
+ int m_perceptual;
+ };
+#pragma pack(pop)
+
+ bool opencl_find_optimal_selector_clusters_for_each_block(
+ opencl_context_ptr pContext,
+ const fosc_block_struct* pInput_block_info, // one per block
+ uint32_t total_input_selectors,
+ const fosc_selector_struct* pInput_selectors,
+ const uint32_t* pSelector_cluster_indices,
+ uint32_t* pOutput_selector_cluster_indices, // one per block
+ bool perceptual);
+
+#pragma pack(push, 1)
+ struct ds_param_struct
+ {
+ uint32_t m_total_blocks;
+ int m_perceptual;
+ };
+#pragma pack(pop)
+
+ bool opencl_determine_selectors(
+ opencl_context_ptr pContext,
+ const color_rgba* pInput_etc_color5_and_inten,
+ etc_block* pOutput_blocks,
+ bool perceptual);
+
+} // namespace basisu