Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
b4c4931
Fix OpenGL context creation on Wayland
adam-ce Aug 14, 2026
959d00b
Add GPU texture compression benchmark
adam-ce Aug 17, 2026
97dc1d7
Fix WebGL texture compression shader
adam-ce Aug 17, 2026
c7f1dd5
Report texture compression GL errors
adam-ce Aug 17, 2026
d963153
Remove texture compression GL diagnostics
adam-ce Aug 18, 2026
fde70b4
Add fragment shader texture compression backend
adam-ce Aug 18, 2026
29d7f21
Improve GPU texture compression profiling
adam-ce Aug 18, 2026
a8d21fd
Add asynchronous GPU compression verification
adam-ce Aug 18, 2026
e780dc4
Remove transform feedback texture compression
adam-ce Aug 19, 2026
e74ed62
Use compact texture compression atlases
adam-ce Aug 19, 2026
dccd4a7
Revise texture compression benchmark dataset
adam-ce Aug 19, 2026
298158e
Improve compressed texture preview
adam-ce Aug 19, 2026
4b47ac3
Add BasisU texture compression benchmarks
adam-ce Aug 19, 2026
10c845f
Add fast GPU ETC1 encoder
adam-ce Aug 19, 2026
d313fe6
Add high-quality fast split ETC1 encoder
adam-ce Aug 20, 2026
8c9a678
Optimize fast split ETC1 compression
adam-ce Aug 20, 2026
76f5f82
Report GPU mipmap generation time
adam-ce Aug 20, 2026
c83e9e4
Add GPU encoder preview comparison
adam-ce Aug 20, 2026
c47a843
Improve texture encoder previews
adam-ce Aug 20, 2026
017a0bc
Fix threaded WASM compression benchmark
adam-ce Aug 20, 2026
48040ee
Simplify texture compression preview
adam-ce Aug 21, 2026
66f4e25
Add texture preview algorithm controls
adam-ce Aug 21, 2026
baa2042
Add GPU texture compression benchmark
adam-ce Aug 21, 2026
4f1f12b
Increase compression benchmark repetitions
adam-ce Aug 21, 2026
3c84b95
Add texture compression quality metrics
adam-ce Aug 21, 2026
4824e78
Remove redundant texture compression encoders
adam-ce Aug 21, 2026
4a7608f
Add ETC1 modifier selection variants
adam-ce Aug 22, 2026
1da7532
Keep ETC1 search and fused exact encoders
adam-ce Aug 22, 2026
601b5d3
Add ETC1 residual refinement encoders
adam-ce Aug 22, 2026
2f74569
Use Radix to stitch compression benchmark tiles
adam-ce Aug 23, 2026
71884b2
Benchmark texture compression readback variants
adam-ce Aug 23, 2026
cff632e
Use automatic texture compression readback fallback
adam-ce Aug 25, 2026
c0075da
Refactor GPU texture compression encoder
adam-ce Aug 29, 2026
006b68c
Fix KTX dependency for WebGPU engine
adam-ce Aug 29, 2026
a224600
Restore default WebGPU app build
adam-ce Aug 29, 2026
8d4d9cf
Clean up ShaderProgram upstream diff
adam-ce Aug 29, 2026
39e19f0
Use Framebuffer for texture compression output
adam-ce Aug 30, 2026
f85bc9e
Harden texture compression setup and errors
adam-ce Aug 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ option(ALP_BUILD_UNITTESTS "include unit test targets in the buildsystem" ON)
option(ALP_BUILD_GL_ENGINE "include the gl engine in the buildsystem" OFF)
option(ALP_BUILD_PLAIN_RENDERER "include the plain renderer in the buildsystem" ON)
option(ALP_BUILD_ALPINEAPP "include the qml app in the buildsystem" ON)
option(ALP_BUILD_TEXTURE_COMPRESSION_PREVIEW "include the texture compression preview application" OFF)
set(ALP_WEBGPU_DEFAULT ON)
if (APPLE OR ANDROID)
set(ALP_WEBGPU_DEFAULT OFF)
Expand Down Expand Up @@ -124,7 +125,7 @@ endif()

add_subdirectory(nucleus)

if (ALP_BUILD_GL_ENGINE OR ALP_BUILD_PLAIN_RENDERER OR ALP_BUILD_ALPINEAPP)
if (ALP_BUILD_GL_ENGINE OR ALP_BUILD_PLAIN_RENDERER OR ALP_BUILD_ALPINEAPP OR ALP_BUILD_TEXTURE_COMPRESSION_PREVIEW)
add_subdirectory(gl_engine)
endif()
if (ALP_BUILD_PLAIN_RENDERER)
Expand All @@ -139,6 +140,9 @@ if (ALP_BUILD_ALPINEAPP)
endif()
add_subdirectory(app)
endif()
if (ALP_BUILD_TEXTURE_COMPRESSION_PREVIEW)
add_subdirectory(apps/texture_compression_benchmark)
endif()

if (ALP_BUILD_WEBGPU_BASE OR ALP_BUILD_WEBGPU_ENGINE OR ALP_BUILD_WEBGPU_COMPUTE OR ALP_BUILD_WEBGPU_APP)
include(${CMAKE_SOURCE_DIR}/cmake/SetupWebGPUPlatform.cmake)
Expand Down
37 changes: 19 additions & 18 deletions app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,25 @@ int main(int argc, char **argv)
{
// originalHandler = qInstallMessageHandler(filter_log);
QQuickWindow::setGraphicsApi(QSGRendererInterface::GraphicsApi::OpenGLRhi);

QSurfaceFormat fmt;
fmt.setDepthBufferSize(24);
#ifdef ALP_ENABLE_DEV_TOOLS
fmt.setOption(QSurfaceFormat::DebugContext);
#endif

if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
qDebug("Requesting 3.3 core context");
fmt.setRenderableType(QSurfaceFormat::OpenGL);
fmt.setVersion(3, 3);
fmt.setProfile(QSurfaceFormat::CoreProfile);
} else {
qDebug("Requesting 3.0 context");
fmt.setVersion(3, 0);
}

QSurfaceFormat::setDefaultFormat(fmt);

#if defined(ALP_ENABLE_DEV_TOOLS) || defined(__ANDROID__)
QApplication app(argc, argv);
#else
Expand Down Expand Up @@ -121,23 +140,6 @@ int main(int argc, char **argv)
}
}

QSurfaceFormat fmt;
fmt.setDepthBufferSize(24);
#ifdef ALP_ENABLE_DEV_TOOLS
fmt.setOption(QSurfaceFormat::DebugContext);
#endif

if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
qDebug("Requesting 3.3 core context");
fmt.setVersion(3, 3);
fmt.setProfile(QSurfaceFormat::CoreProfile);
} else {
qDebug("Requesting 3.0 context");
fmt.setVersion(3, 0);
}

QSurfaceFormat::setDefaultFormat(fmt);

// create in main thread
#ifdef ALP_ENABLE_DEV_TOOLS
TimerFrontendManager::instance();
Expand Down Expand Up @@ -192,4 +194,3 @@ int main(int argc, char **argv)

return app.exec();
}

59 changes: 59 additions & 0 deletions apps/texture_compression_benchmark/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#############################################################################
# AlpineMaps.org
# Copyright (C) 2026 Adam Celarek
# SPDX-License-Identifier: GPL-3.0-or-later
#############################################################################

project(texture-compression-preview LANGUAGES CXX)

qt_add_executable(texture_compression_preview
main.cpp
TextureCompressionData.h
TexturePreviewItem.h
TexturePreviewItem.cpp
)

qt_add_qml_module(texture_compression_preview
URI TextureCompressionPreview
VERSION 1.0
RESOURCE_PREFIX /qt/qml
QML_FILES Main.qml
)

qt_add_resources(texture_compression_preview "fonts"
BASE "${alpineapp_fonts_SOURCE_DIR}"
PREFIX "/fonts"
FILES "${alpineapp_fonts_SOURCE_DIR}/Roboto/Roboto-Regular.ttf"
)

target_link_libraries(texture_compression_preview PUBLIC gl_engine Qt::Network Qt::Quick Qt::QuickControls2)
alp_configure_target(texture_compression_preview)

if (ANDROID)
add_android_openssl_libraries(texture_compression_preview)
set_target_properties(texture_compression_preview PROPERTIES
QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android"
QT_ANDROID_PACKAGE_NAME "org.alpinemaps.texturecompressionpreview"
QT_ANDROID_VERSION_NAME "1.0"
QT_ANDROID_VERSION_CODE 1
)
install(TARGETS texture_compression_preview
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()

if (EMSCRIPTEN)
install(
FILES
"$<TARGET_FILE_DIR:texture_compression_preview>/texture_compression_preview.js"
"$<TARGET_FILE_DIR:texture_compression_preview>/texture_compression_preview.wasm"
"$<TARGET_FILE_DIR:texture_compression_preview>/texture_compression_preview.html"
"$<TARGET_FILE_DIR:texture_compression_preview>/qtloader.js"
DESTINATION "${ALP_WWW_INSTALL_DIR}/texture_compression_preview"
)
install(
FILES "$<TARGET_FILE_DIR:texture_compression_preview>/texture_compression_preview.worker.js"
DESTINATION "${ALP_WWW_INSTALL_DIR}/texture_compression_preview"
OPTIONAL
)
endif()
158 changes: 158 additions & 0 deletions apps/texture_compression_benchmark/Main.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import TextureCompressionPreview

ApplicationWindow {
id: root

width: 900
height: 900
minimumWidth: 360
minimumHeight: 480
visible: true
title: qsTr("Texture Compression Preview")
LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
LayoutMirroring.childrenInherit: true

ColumnLayout {
anchors.fill: parent
anchors.margins: 20
spacing: 12

Label {
Layout.fillWidth: true
text: qsTr("Texture compression preview")
font.pointSize: 20
font.weight: Font.Medium
wrapMode: Text.Wrap
}

Label {
Layout.fillWidth: true
text: preview.status
wrapMode: Text.Wrap
}

GridLayout {
Layout.fillWidth: true
columns: width >= 760 ? 9 : width >= 500 ? 5 : 3
columnSpacing: 6
rowSpacing: 6

Repeater {
model: preview.previewEncoders

Button {
required property int index
required property string modelData

Layout.fillWidth: true
text: modelData
enabled: preview.ready
highlighted: preview.previewEncoder === index
onClicked: preview.previewEncoder = index
}
}
}

Item {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.minimumHeight: 300

Flickable {
id: previewViewport

anchors.fill: parent
clip: true
boundsBehavior: Flickable.StopAtBounds
contentWidth: Math.max(width, previewHost.width * previewHost.scale)
contentHeight: Math.max(height, previewHost.height * previewHost.scale)

Item {
id: previewHost

readonly property real fittedSize: Math.min(previewViewport.width, previewViewport.height)

x: (previewViewport.contentWidth - width) / 2
y: (previewViewport.contentHeight - height) / 2
width: fittedSize
height: width

TexturePreviewItem {
id: preview
anchors.fill: parent
}

PinchHandler {
target: previewHost
rotationAxis.enabled: false
xAxis.enabled: false
yAxis.enabled: false
scaleAxis.minimum: 1
scaleAxis.maximum: 8
}
}
}

BusyIndicator {
anchors.centerIn: parent
running: preview.loading
visible: running
}
}

RowLayout {
Layout.fillWidth: true

Label {
Layout.fillWidth: true
text: preview.ready
? (Number.isFinite(preview.previewPsnr)
? qsTr("%1 — PSNR: %2 dB").arg(preview.previewName).arg(preview.previewPsnr.toFixed(2))
: qsTr("%1 — PSNR: ∞").arg(preview.previewName))
: ""
wrapMode: Text.Wrap
}

Button {
text: qsTr("Description")
enabled: preview.ready
onClicked: {
if (descriptionDialogLoader.status === Loader.Ready)
descriptionDialogLoader.item.open()
else
descriptionDialogLoader.active = true
}
}
}
}

Loader {
id: descriptionDialogLoader

active: false
asynchronous: true
onLoaded: {
if (status === Loader.Ready)
item.open()
}

sourceComponent: Component {
Dialog {
parent: Overlay.overlay
anchors.centerIn: parent
width: Math.min(root.width - 40, 560)
modal: true
title: preview.previewName
standardButtons: Dialog.Close

contentItem: Label {
text: preview.previewDescription
wrapMode: Text.Wrap
}
}
}
}
}
47 changes: 47 additions & 0 deletions apps/texture_compression_benchmark/TextureCompressionData.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*****************************************************************************
* AlpineMaps.org
* Copyright (C) 2026 Adam Celarek
* SPDX-License-Identifier: GPL-3.0-or-later
*****************************************************************************/

#pragma once

#include <QString>
#include <array>

namespace texture_compression_data {

struct TileGroup {
int zoom;
int y;
int x;
};

constexpr std::array<TileGroup, 16> tile_groups { {
{ 17, 45448, 71496 },
{ 16, 22832, 35144 },
{ 16, 23030, 35578 },
{ 13, 2852, 4476 },
{ 14, 5702, 8808 },
{ 15, 11574, 17670 },
{ 16, 23030, 35078 },
{ 15, 11460, 17622 },
{ 14, 5752, 8656 },
{ 16, 23084, 34746 },
{ 14, 5684, 8926 },
{ 15, 11418, 17692 },
{ 16, 22956, 34570 },
{ 15, 11358, 17904 },
{ 16, 22910, 35770 },
{ 14, 5656, 8938 },
} };

inline QString tile_url(const TileGroup& group, int x_offset, int y_offset)
{
return QStringLiteral("https://gataki.cg.tuwien.ac.at/raw/basemap/tiles/%1/%2/%3.jpeg")
.arg(group.zoom)
.arg(group.y + y_offset)
.arg(group.x + x_offset);
}

} // namespace texture_compression_data
Loading