Compare commits

...
Sign in to create a new pull request.

7 commits

Author SHA1 Message Date
f9b1ac8c84
wip
Some checks reported errors
continuous-integration/drone/pr Build was killed
2025-10-21 13:19:20 +03:30
368ea7e1d0
refactor: remove msan specific code
Some checks reported errors
continuous-integration/drone/pr Build was killed
2025-10-21 13:14:28 +03:30
8c0dbdd52a
wip
Some checks failed
continuous-integration/drone/pr Build is failing
2025-10-16 15:06:50 +03:30
5a922cac71
wip
Some checks failed
continuous-integration/drone/pr Build is failing
2025-10-16 14:55:49 +03:30
2f7c729f88
wip
Some checks failed
continuous-integration/drone/pr Build is failing
2025-10-16 14:52:32 +03:30
bcb1acbf75
wip
Some checks failed
continuous-integration/drone/pr Build is failing
2025-10-16 14:46:14 +03:30
6aa03cc05b squash wip
Some checks reported errors
continuous-integration/drone/pr Build was killed
2025-10-16 14:45:35 +03:30
11 changed files with 710 additions and 322 deletions

View file

@ -1,42 +1,42 @@
--- # ---
kind: pipeline # kind: pipeline
type: exec # type: exec
name: amd64 — msvc # name: amd64 — msvc
trigger: # trigger:
branch: # branch:
- main # - main
platform: # platform:
os: windows # os: windows
arch: amd64 # arch: amd64
#
steps: # steps:
- name: unit tests # - name: unit tests
shell: powershell # shell: powershell
commands: # commands:
- ./tools/ci/amd64/msvc/unit_tests.ps1 # - ./tools/ci/amd64/msvc/unit_tests.ps1
#
--- # ---
kind: pipeline # kind: pipeline
type: docker # type: docker
name: amd64 — gcc # name: amd64 — gcc
trigger: # trigger:
branch: # branch:
- main # - main
#
steps: # steps:
- name: unit tests # - name: unit tests
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/amd64/gcc/unit_tests.sh # - ./tools/ci/amd64/gcc/unit_tests.sh
#
- name: valgrind # - name: valgrind
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/amd64/gcc/valgrind.sh # - ./tools/ci/amd64/gcc/valgrind.sh
#
--- # ---
kind: pipeline kind: pipeline
type: docker type: docker
name: amd64 — clang name: amd64 — clang
@ -45,113 +45,114 @@ trigger:
- main - main
steps: steps:
- name: code coverage # - name: code coverage
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
environment: # environment:
CODECOV_TOKEN: # CODECOV_TOKEN:
from_secret: CODECOV_TOKEN # from_secret: CODECOV_TOKEN
commands: # commands:
- ./tools/ci/amd64/clang/coverage.sh # - ./tools/ci/amd64/clang/coverage.sh
#
- name: leak sanitizer # - name: leak sanitizer
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/amd64/clang/lsan.sh # - ./tools/ci/amd64/clang/lsan.sh
#
- name: memory sanitizer - name: memory sanitizer
image: ci:latest image: ci:latest
pull: if-not-exists pull: if-not-exists
commands: commands:
- ./tools/ci/amd64/clang/msan.sh - ./tools/ci/amd64/clang/msan.sh
#
--- # ---
kind: pipeline # kind: pipeline
type: docker # type: docker
name: static analysis # name: static analysis
trigger: # trigger:
branch: # branch:
- main # - main
#
steps: # steps:
- name: clang tidy # - name: clang tidy
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
privileged: true # privileged: true
commands: # commands:
- ./tools/ci/static_analysis/clang_tidy.sh # - ./tools/ci/static_analysis/clang_tidy.sh
#
- name: shell check # - name: shell check
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/static_analysis/shell_check.sh # - ./tools/ci/static_analysis/shell_check.sh
#
- name: clang format # - name: clang format
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/static_analysis/clang_format.sh # - ./tools/ci/static_analysis/clang_format.sh
#
- name: cmake format # - name: cmake format
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/static_analysis/cmake_format.sh # - ./tools/ci/static_analysis/cmake_format.sh
#
- name: shell format # - name: shell format
image: ci:latest # image: ci:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- ./tools/ci/static_analysis/shell_format.sh # - ./tools/ci/static_analysis/shell_format.sh
#
--- # ---
kind: pipeline # kind: pipeline
type: docker # type: docker
name: documentation — development # name: documentation — development
node: # node:
environment: ryali # environment: ryali
trigger: # trigger:
branch: # branch:
- main # - main
#
steps: # steps:
- name: build and deploy # - name: build and deploy
image: documentation:latest # image: documentation:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- pwd # - pwd
- cd docs # - cd docs
- mkdir generated # - mkdir generated
- touch generated/changelogs.rst # - touch generated/changelogs.rst
- touch generated/api.rst # - touch generated/api.rst
- sphinx-build -M html . . # - sphinx-build -M html . .
#
- rm -rf /light_docs_dev/* # - rm -rf /light_docs_dev/*
- mv ./html/* /light_docs_dev/ # - mv ./html/* /light_docs_dev/
#
--- # ---
#
kind: pipeline # kind: pipeline
type: docker # type: docker
name: documentation — production # name: documentation — production
node: # node:
environment: ryali # environment: ryali
trigger: # trigger:
event: # event:
- tag # - tag
#
steps: # steps:
- name: build and deploy # - name: build and deploy
image: documentation:latest # image: documentation:latest
pull: if-not-exists # pull: if-not-exists
commands: # commands:
- cd docs # - cd docs
- mkdir generated # - mkdir generated
- touch generated/changelogs.rst # - touch generated/changelogs.rst
- touch generated/api.rst # - touch generated/api.rst
- sphinx-build -M html . . # - sphinx-build -M html . .
#
- rm -rf /light_docs/* # - rm -rf /light_docs/*
- mv ./html/* /light_docs/ # - mv ./html/* /light_docs/
#

View file

@ -2,18 +2,25 @@
namespace lt::assets { namespace lt::assets {
constexpr auto total_metadata_size = //
sizeof(AssetMetadata::type) //
+ sizeof(AssetMetadata::version) //
+ sizeof(ShaderAsset::Metadata::type) //
+ sizeof(BlobMetadata::tag) //
+ sizeof(BlobMetadata::offset) //
+ sizeof(BlobMetadata::compression_type) //
+ sizeof(BlobMetadata::compressed_size) //
+ sizeof(BlobMetadata::uncompressed_size);
ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path)
{ {
constexpr auto total_metadata_size = //
sizeof(AssetMetadata) //
+ sizeof(Metadata) //
+ sizeof(BlobMetadata);
ensure(m_stream.is_open(), "Failed to open shader asset at: {}", path.string()); ensure(m_stream.is_open(), "Failed to open shader asset at: {}", path.string());
const auto read = [this](auto &field) {
m_stream.read(std::bit_cast<char *>(&field), sizeof(field));
};
m_stream.seekg(0, std::ifstream::end); m_stream.seekg(0, std::ifstream::end);
const auto file_size = static_cast<size_t>(m_stream.tellg()); const auto file_size = static_cast<size_t>(m_stream.tellg());
ensure( ensure(
file_size > total_metadata_size, file_size > total_metadata_size,
"Failed to open shader asset at: {}, file smaller than metadata: {} < {}", "Failed to open shader asset at: {}, file smaller than metadata: {} < {}",
@ -22,12 +29,15 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path)
file_size file_size
); );
// NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast)
m_stream.seekg(0, std::ifstream::beg); m_stream.seekg(0, std::ifstream::beg);
m_stream.read((char *)&m_asset_metadata, sizeof(m_asset_metadata)); read(m_asset_metadata.type);
m_stream.read((char *)&m_metadata, sizeof(m_metadata)); read(m_asset_metadata.version);
m_stream.read((char *)&m_code_blob_metadata, sizeof(m_code_blob_metadata)); read(m_metadata.type);
// NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) read(m_code_blob_metadata.tag);
read(m_code_blob_metadata.offset);
read(m_code_blob_metadata.compression_type);
read(m_code_blob_metadata.compressed_size);
read(m_code_blob_metadata.uncompressed_size);
ensure( ensure(
m_asset_metadata.type == asset_type_identifier, m_asset_metadata.type == asset_type_identifier,
@ -69,4 +79,70 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path)
); );
} }
/* static */ void ShaderAsset::pack(
const std::filesystem::path &destination,
AssetMetadata asset_metadata,
Metadata metadata,
Blob code_blob
)
{
auto stream = std::ofstream {
destination,
std::ios::binary | std::ios::trunc,
};
const auto code_blob_metadata = BlobMetadata {
.tag = std::to_underlying(BlobTag::code),
.offset = total_metadata_size,
.compression_type = CompressionType::none,
.compressed_size = code_blob.size(),
.uncompressed_size = code_blob.size(),
};
ensure(stream.is_open(), "Failed to pack shader asset to {}", destination.string());
const auto write = [&stream](auto &field) {
stream.write(std::bit_cast<char *>(&field), sizeof(field));
};
write(asset_metadata.type);
write(asset_metadata.version);
write(metadata.type);
write(code_blob_metadata.tag);
write(code_blob_metadata.offset);
write(code_blob_metadata.compression_type);
write(code_blob_metadata.compressed_size);
write(code_blob_metadata.uncompressed_size);
stream.write(std::bit_cast<char *>(code_blob.data()), static_cast<long long>(code_blob.size()));
}
void ShaderAsset::unpack_to(BlobTag tag, std::span<std::byte> destination) const
{
ensure(tag == BlobTag::code, "Invalid blob tag for shader asset: {}", std::to_underlying(tag));
ensure(
destination.size() >= m_code_blob_metadata.uncompressed_size,
"Failed to unpack shader blob {} to destination ({}) of size {} since it's smaller "
"than the blobl's uncompressed size: {}",
std::to_underlying(tag),
std::bit_cast<size_t>(destination.data()),
destination.size(),
m_code_blob_metadata.uncompressed_size
);
m_stream.seekg(static_cast<long long>(m_code_blob_metadata.offset));
m_stream.read(
std::bit_cast<char *>(destination.data()),
static_cast<long long>(m_code_blob_metadata.uncompressed_size)
);
}
[[nodiscard]] auto ShaderAsset::unpack(BlobTag tag) const -> Blob
{
ensure(tag == BlobTag::code, "Invalid blob tag for shader asset: {}", std::to_underlying(tag));
auto blob = Blob(m_code_blob_metadata.uncompressed_size);
unpack_to(tag, blob);
return blob;
}
} // namespace lt::assets } // namespace lt::assets

View file

@ -41,9 +41,14 @@ Suite packing = "shader_pack"_suite = [] {
} }
const auto expected_size = // const auto expected_size = //
sizeof(AssetMetadata) // sizeof(AssetMetadata::type) //
+ sizeof(ShaderAsset::Metadata) // + sizeof(AssetMetadata::version) //
+ sizeof(BlobMetadata) // + sizeof(ShaderAsset::Metadata::type) //
+ sizeof(BlobMetadata::tag) //
+ sizeof(BlobMetadata::offset) //
+ sizeof(BlobMetadata::compression_type) //
+ sizeof(BlobMetadata::compressed_size) //
+ sizeof(BlobMetadata::uncompressed_size) //
+ dummy_blob.size(); + dummy_blob.size();
ShaderAsset::pack( ShaderAsset::pack(

View file

@ -32,33 +32,14 @@ public:
AssetMetadata asset_metadata, AssetMetadata asset_metadata,
Metadata metadata, Metadata metadata,
Blob code_blob Blob code_blob
) );
{
auto stream = std::ofstream {
destination,
std::ios::binary | std::ios::trunc,
};
ensure(stream.is_open(), "Failed to pack shader asset to {}", destination.string());
// NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast)
stream.write((char *)&asset_metadata, sizeof(asset_metadata));
stream.write((char *)&metadata, sizeof(metadata));
auto code_blob_metadata = BlobMetadata {
.tag = std::to_underlying(BlobTag::code),
.offset = static_cast<size_t>(stream.tellp()) + sizeof(BlobMetadata),
.compression_type = CompressionType::none,
.compressed_size = code_blob.size(),
.uncompressed_size = code_blob.size(),
};
stream.write((char *)&code_blob_metadata, sizeof(BlobMetadata));
stream.write((char *)code_blob.data(), static_cast<long long>(code_blob.size()));
// NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast)
}
ShaderAsset(const std::filesystem::path &path); ShaderAsset(const std::filesystem::path &path);
void unpack_to(BlobTag tag, std::span<std::byte> destination) const;
[[nodiscard]] auto unpack(BlobTag tag) const -> Blob;
[[nodiscard]] auto get_asset_metadata() const -> const AssetMetadata & [[nodiscard]] auto get_asset_metadata() const -> const AssetMetadata &
{ {
return m_asset_metadata; return m_asset_metadata;
@ -80,45 +61,6 @@ public:
return m_code_blob_metadata; return m_code_blob_metadata;
} }
void unpack_to(BlobTag tag, std::span<std::byte> destination) const
{
ensure(
tag == BlobTag::code,
"Invalid blob tag for shader asset: {}",
std::to_underlying(tag)
);
ensure(
destination.size() >= m_code_blob_metadata.uncompressed_size,
"Failed to unpack shader blob {} to destination ({}) of size {} since it's smaller "
"than the blobl's uncompressed size: {}",
std::to_underlying(tag),
(size_t)(destination.data()), // NOLINT(cppcoreguidelines-pro-type-cstyle-cast)
destination.size(),
m_code_blob_metadata.uncompressed_size
);
m_stream.seekg(static_cast<long long>(m_code_blob_metadata.offset));
m_stream.read(
(char *)destination.data(), // NOLINT(cppcoreguidelines-pro-type-cstyle-cast)
static_cast<long long>(m_code_blob_metadata.uncompressed_size)
);
}
[[nodiscard]] auto unpack(BlobTag tag) const -> Blob
{
ensure(
tag == BlobTag::code,
"Invalid blob tag for shader asset: {}",
std::to_underlying(tag)
);
auto blob = Blob(m_code_blob_metadata.uncompressed_size);
unpack_to(tag, blob);
return blob;
}
private: private:
AssetMetadata m_asset_metadata {}; AssetMetadata m_asset_metadata {};

View file

@ -217,6 +217,7 @@ void Instance::initialize_instance()
vkc(vk_enumerate_instance_extension_properties(nullptr, &count, nullptr)); vkc(vk_enumerate_instance_extension_properties(nullptr, &count, nullptr));
auto extensions = std::vector<VkExtensionProperties>(count); auto extensions = std::vector<VkExtensionProperties>(count);
memset(extensions.data(), 0, extensions.size() * sizeof(VkExtensionProperties));
vkc(vk_enumerate_instance_extension_properties(nullptr, &count, extensions.data())); vkc(vk_enumerate_instance_extension_properties(nullptr, &count, extensions.data()));
// log_inf("Available vulkan instance extensions:"); // log_inf("Available vulkan instance extensions:");
@ -232,7 +233,7 @@ void Instance::initialize_instance()
void Instance::load_library() void Instance::load_library()
{ {
constexpr auto runtime_loader_flags = RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL | RTLD_NODELETE; constexpr auto runtime_loader_flags = RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE;
library = dlopen("libvulkan.so.1", runtime_loader_flags); library = dlopen("libvulkan.so.1", runtime_loader_flags);
if (!library) if (!library)
{ {

View file

@ -75,7 +75,6 @@ private:
void load_instance_functions(); void load_instance_functions();
void load_device_functions_impl(VkDevice device); void load_device_functions_impl(VkDevice device);
VkInstance m_instance = VK_NULL_HANDLE; VkInstance m_instance = VK_NULL_HANDLE;
VkAllocationCallbacks *m_allocator = nullptr; VkAllocationCallbacks *m_allocator = nullptr;

View file

@ -11,14 +11,18 @@
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/keysymdef.h> #include <X11/keysymdef.h>
//
namespace lt::surface { namespace lt::surface {
template<int EventType> template<int EventType>
int XEventTypeEquals(Display *, XEvent *event, XPointer winptr) auto XEventTypeEquals(Display *display, XEvent *event, char *winptr) -> int
{ {
std::ignore = display;
return ( return (
event->type == EventType event->type == EventType
&& *(reinterpret_cast<Window *>(winptr)) == reinterpret_cast<XAnyEvent *>(event)->window && *(std::bit_cast<const Window *>(winptr))
== std::bit_cast<const XAnyEvent *>(event)->window
); );
} }
@ -160,7 +164,7 @@ try
XSetWMProtocols(display, main_window, &surface.m_native_data.wm_delete_message, 1); XSetWMProtocols(display, main_window, &surface.m_native_data.wm_delete_message, 1);
// code to remove decoration // code to remove decoration
auto hints = std::array<unsigned char, 5> { 2, 0, 0, 0, 0 }; auto hints = std::array<const unsigned char, 5> { 2, 0, 0, 0, 0 };
const auto motif_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False); const auto motif_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False);
XChangeProperty( XChangeProperty(
@ -340,7 +344,7 @@ void System::modify_resolution(SurfaceComponent &surface, const ModifyResolution
// XResizeWindow(display, window, width, height); // XResizeWindow(display, window, width, height);
// get baseline serial number for X requests generated from XResizeWindow // get baseline serial number for X requests generated from XResizeWindow
uint64_t serial = NextRequest(display); auto serial = NextRequest(display);
// request a new window size from the X server // request a new window size from the X server
XResizeWindow(display, window, static_cast<uint32_t>(width), static_cast<uint32_t>(height)); XResizeWindow(display, window, static_cast<uint32_t>(width), static_cast<uint32_t>(height));
@ -396,7 +400,7 @@ void System::modify_position(SurfaceComponent &surface, const ModifyPositionRequ
const auto &[x, y] = request.position; const auto &[x, y] = request.position;
// get baseline serial number for X requests generated from XResizeWindow // get baseline serial number for X requests generated from XResizeWindow
uint64_t serial = NextRequest(display); auto serial = NextRequest(display);
XMoveWindow(display, window, static_cast<int>(x), static_cast<int>(y)); XMoveWindow(display, window, static_cast<int>(x), static_cast<int>(y));
// flush output queue and wait for X server to processes the request // flush output queue and wait for X server to processes the request

View file

@ -16,7 +16,6 @@ using test::expect_eq;
using test::expect_ne; using test::expect_ne;
using test::expect_not_nullptr; using test::expect_not_nullptr;
using test::expect_throw; using test::expect_throw;
using test::expect_true;
using test::Suite; using test::Suite;
[[nodiscard]] auto tick_info() -> app::TickInfo [[nodiscard]] auto tick_info() -> app::TickInfo

View file

@ -1,99 +1,447 @@
FROM archlinux:latest FROM archlinux:latest
## Configurations ##
RUN \
mkdir /msan \
&& echo 'src:*' > /msan/ignorelist_all_sources \
&& sed -i 's/^#ParallelDownloads = .*/ParallelDownloads = 8/' /etc/pacman.conf \
&& echo 'NoExtract = usr/share/{man,doc,info}/*' >> /etc/pacman.conf
## Packages ## ## Packages ##
RUN \ RUN \
sed -i 's/^#ParallelDownloads = .*/ParallelDownloads = 8/' /etc/pacman.conf \ pacman -Syyu --noconfirm --needed --disable-download-timeout \
&& echo 'NoExtract = usr/share/{man,doc,info}/*' >> /etc/pacman.conf \ afl++ \
&& pacman -Syyu --noconfirm --needed --disable-download-timeout \ afl-utils \
afl++ \ base-devel \
afl-utils \ bash \
base-devel \ cbindgen \
bash \ clang \
clang \ cmake \
cmake \ curl \
curl \ debuginfod \
expat \ directx-headers \
gcc \ elfutils \
gdb \ expat \
git \ gcc \
glm \ gcc-libs \
libc++ \ gdb \
libinput \ git \
libpciaccess \ glibc \
libpng \ glm \
libunwind \ glslang \
libx11 \ libc++ \
libxcb \ libclc \
libxcursor \ libdrm \
libxi \ libelf \
libxinerama \ libglvnd \
libxpresent \ libinput \
libxrandr \ libpciaccess \
lz4 \ libpng \
mesa \ libunwind \
mold \ libva \
ninja \ libx11 \
python \ libxcb \
python-distlib \ libxdamage \
python-distutils-extra \ libxext \
python-jsonschema \ libxfixes \
qt5-base \ libxi \
qt6-base \ libxinerama \
valgrind \ libxml2 \
vulkan-headers \ libxpresent \
vulkan-icd-loader \ libxrandr \
vulkan-tools \ libxshmfence \
vulkan-validation-layers \ libxxf86vm \
wayland \ lm_sensors \
wayland-protocols \ llvm \
wget \ lz4 \
xcb-util \ meson \
xcb-util-cursor \ mold \
xcb-util-keysyms \ ninja \
xcb-util-wm \ python \
xorg-server-xvfb \ python-distlib \
xorg-util-macros \ python-distutils-extra \
xtrans \ python-jsonschema \
zlib \ python-mako \
zstd \ python-packaging \
python-ply \
python-pyaml \
qt5-base \
qt6-base \
rust \
rust-bindgen \
spirv-llvm-translator \
spirv-tools \
systemd-libs \
valgrind \
vulkan-headers \
vulkan-icd-loader \
vulkan-tools \
vulkan-validation-layers \
wayland \
wayland-protocols \
wget \
xcb-proto \
xcb-util \
xcb-util-cursor \
xcb-util-keysyms \
xcb-util-wm \
xorg-server-xvfb \
xorg-util-macros \
xorgproto \
xtrans \
zlib \
zstd \
&& pacman -Scc --noconfirm && pacman -Scc --noconfirm
## Sanitizers ## ## Libc++ ##
RUN \ RUN \
git clone --depth=1 https://github.com/llvm/llvm-project.git -b llvmorg-20.1.8 \ git clone \
&& mkdir llvm-project/build-lsan llvm-project/build-msan \ --branch llvmorg-20.1.8 \
--depth=1 \
https://github.com/llvm/llvm-project.git
RUN git clone \
--branch='25.2'\
--depth=1 \
https://gitlab.freedesktop.org/mesa/mesa.git
RUN wget https://x.org/releases/individual/lib/libxcb-1.17.0.tar.xz
RUN wget https://x.org/releases/individual/lib/libX11-1.8.12.tar.xz
RUN wget 'https://sdk.lunarg.com/sdk/download/1.4.328.1/linux/vulkansdk-linux-x86_64-1.4.328.1.tar.xz'
RUN cd llvm-project/ \
\ \
&& cd llvm-project/build-lsan \ && cmake \
&& cmake -G Ninja \ -S ./runtimes \
-DCMAKE_BUILD_TYPE=Release \ -B ./build-lsan \
-DCMAKE_LINKER_TYPE="MOLD" \ -G Ninja \
-DCMAKE_INSTALL_PREFIX=/libcxx_lsan \ -D CMAKE_LINKER_TYPE="MOLD" \
-DCMAKE_C_COMPILER=clang \ -D CMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER=clang++ \ -D CMAKE_INSTALL_PREFIX=/libcxx_lsan \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ -D CMAKE_C_COMPILER=$(which clang) \
-DLLVM_ENABLE_PIC=ON \ -D CMAKE_CXX_COMPILER=$(which clang++) \
-DLIBCXX_INSTALL_MODULES=ON \ -D LLVM_ENABLE_PROJECTS="clang;compiler-rt" \
-DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ -D LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
-DLLVM_USE_SANITIZER=Leaks \ -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \
../runtimes \ -D LLVM_ENABLE_PIC=ON \
&& ninja cxx cxxabi \ -D LIBCXX_INSTALL_MODULES=ON \
&& ninja install-cxx install-cxxabi \ -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \
-D LLVM_USE_SANITIZER=Leaks \
-D LLVM_USE_LINKER="MOLD" \
&& cd ./build-lsan/ && ninja cxx cxxabi && ninja install-cxx install-cxxabi && cd ../ \
\ \
&& cd ../build-msan \ && cmake \
&& cmake -G Ninja \ -S ./runtimes \
-DCMAKE_BUILD_TYPE=Release \ -B ./build-msan \
-DCMAKE_LINKER_TYPE="MOLD" \ -G Ninja \
-DCMAKE_INSTALL_PREFIX=/libcxx_msan \ -D CMAKE_LINKER_TYPE="MOLD" \
-DCMAKE_C_COMPILER=clang \ -D CMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER=clang++ \ -D CMAKE_INSTALL_PREFIX=/libcxx_msan \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ -D CMAKE_C_COMPILER=$(which clang) \
-DLLVM_ENABLE_PIC=ON \ -D CMAKE_CXX_COMPILER=$(which clang++) \
-DLIBCXX_INSTALL_MODULES=ON \ -D LLVM_ENABLE_PROJECTS="clang;compiler-rt" \
-DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ -D LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
-DLLVM_USE_SANITIZER=MemoryWithOrigins \ -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \
../runtimes \ -D LLVM_ENABLE_PIC=ON \
&& ninja cxx cxxabi \ -D LIBCXX_INSTALL_MODULES=ON \
&& ninja install-cxx install-cxxabi \ -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \
-D LLVM_USE_SANITIZER=MemoryWithOrigins \
-D LLVM_USE_LINKER="MOLD" \
&& cd ./build-msan/ && ninja cxx cxxabi && ninja install-cxx install-cxxabi && cd ../
RUN cd llvm-project/
## libxcb ##
RUN \
tar xf libxcb-1.17.0.tar.xz \
&& cd libxcb-1.17.0 \
&& export CC=clang \
&& export CFLAGS=" \
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-fno-omit-frame-pointer \
-g \
-fPIC" \
&& export LDFLAGS=" \
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-fno-omit-frame-pointer \
-g \
-fPIC" \
&& ./configure \
--prefix=/msan \
--disable-static \
--without-doxygen \
&& make && make install \
&& cd .. && rm -rf libxcb-1.17.0 libxcb-1.17.0.tar.xz
## libx11 ##
RUN \
tar xf libX11-1.8.12.tar.xz \
&& cd libX11-1.8.12 \
&& export CC=clang \
&& export CFLAGS=" \
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-fno-omit-frame-pointer \
-g \
-fPIC" \
&& export LDFLAGS=" \
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-fno-omit-frame-pointer \
-g \
-fPIC" \
&& export PKG_CONFIG_PATH=/msan/lib/pkgconfig:$PKG_CONFIG_PATH \
&& ./configure \
--prefix=/msan \
--disable-static \
&& make && make install \
&& cd .. && rm -rf libX11-1.8.12 libX11-1.8.12.tar.xz
## Vulkan SDK ##
RUN \
tar xf 'vulkansdk-linux-x86_64-1.4.328.1.tar.xz' \
&& cd /1.4.328.1 \
&& chmod +x ./vulkansdk \
&& chmod +x ./setup-env.sh \
&& export CC="$(which clang)" \
&& export CXX="$(which clang++)" \
&& export CXXFLAGS="\
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-fno-omit-frame-pointer \
-g \
-std=c++23 \
-nostdinc++ \
-isystem /libcxx_msan/include/c++/v1/"\
&& export CFLAGS="\
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fno-omit-frame-pointer \
-g" \
&& export LDFLAGS="\
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-g \
-std=c++23 \
-L/msan/lib -Wl,-rpath,/msan/lib \
-L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \
-lc++ \
-lc++abi" \
&& ./vulkansdk \
--debug \
--skip-installing-deps \
--numjobs `nproc` \
vulkan-loader \
spirv-tools
## Mesa ##
RUN \
export build_llvm=/build-llvm \
&& export build_path=/b_llvm_normal \
&& export repo=/llvm-project \
\ \
&& cd ../.. \ && cmake \
&& rm -rf llvm-project -S $repo/llvm \
-G Ninja \
-B $build_path \
-D CMAKE_BUILD_TYPE=Release \
-D LLVM_ENABLE_PROJECTS="clang;lld;compiler-rt" \
-D CMAKE_C_COMPILER=$(which clang) \
-D CMAKE_CXX_COMPILER=$(which clang++) \
-D CMAKE_INSTALL_PREFIX=/opt/llvm-normal \
&& ninja -C $build_path install
RUN \
export CXXFLAGS="\
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-fno-omit-frame-pointer \
-g \
-std=c++23 \
-nostdinc++ \
-isystem /libcxx_msan/include/c++/v1/"\
&& export CFLAGS="\
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fno-omit-frame-pointer \
-g" \
&& export LDFLAGS="\
-fsanitize=memory \
-fsanitize-memory-track-origins \
-fsanitize-ignorelist=/msan/ignorelist_all_sources \
-g \
-std=c++23 \
-L/msan/lib -Wl,-rpath,/msan/lib \
-L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \
-lc++ \
-lc++abi" \
&& export build_path=/b_llvm_msan \
&& export repo=/llvm-project \
\
&& cmake \
-S $repo/llvm \
-G Ninja \
-B $build_path \
-D CMAKE_BUILD_TYPE=Release \
-D LLVM_ENABLE_PROJECTS="clang;lld" \
-D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \
-D LLVM_ENABLE_PIC=ON \
-D LLVM_NATIVE_TOOL_DIR=/opt/llvm-normal/bin/ \
-D LLVM_USE_SANITIZER=MemoryWithOrigins \
-D LLVM_TABLEGEN=/opt/llvm-normal/bin/llvm-tblgen \
-D LLVM_CONFIG_PATH=/opt/llvm-normal/bin/llvm-config \
-D CMAKE_C_COMPILER=/opt/llvm-normal/bin/clang \
-D CMAKE_CXX_COMPILER=/opt/llvm-normal/bin/clang++ \
-D CMAKE_INSTALL_PREFIX=/opt/llvm-msan \
&& ninja -C $build_path install
# && cmake \
# -G Ninja \
# -S $llvm/llvm \
# -B $build_llvm \
# -D LLVM_INSTALL_UTILS=ON \
# -D CMAKE_INSTALL_PREFIX=$installprefix \
# -D CMAKE_BUILD_TYPE=Release \
# -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \
# -D CMAKE_C_COMPILER=$(which clang) \
# -D CMAKE_CXX_COMPILER=$(which clang++) \
# \
# -D LLVM_USE_SANITIZER=MemoryWithOrigins \
# -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \
# \
# && ninja -C $build_llvm install
#
# && cmake \
# -G Ninja \
# -S $llvm/clang \
# -B $build_clang \
# -D LLVM_EXTERNAL_LIT=$build_llvm/utils/lit \
# -D LLVM_ROOT=$installprefix \
# \
# && ninja -C $build_clang
RUN \
cd /mesa \
&& export CXX='clang++' \
&& export CC='clang' \
&& export CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g" \
&& export CXXFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g -nostdinc++ -isystem /libcxx_msan/include/c++/v1/" \
&& export LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -g -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib -L/msan/lib -Wl,-rpath,/msan/lib -lc++ -lc++abi" \
&& export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH" \
&& meson setup ./ _build \
-D build-tests=false \
-D enable-glcpp-tests=false \
-D build-radv-tests=false \
-D build-aco-tests=false \
-D install-intel-gpu-tests=false \
-D gallium-mediafoundation-test=false \
-D android-libbacktrace=disabled \
-D split-debug=disabled \
-D b_ndebug=true \
-D b_lto=false \
-D egl=enabled \
-D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,softpipe,llvmpipe,i915,iris,crocus,zink \
-D gallium-extra-hud=true \
-D gallium-rusticl=true \
-D gallium-va=enabled \
-D gbm=enabled \
-D gles1=disabled \
-D gles2=enabled \
-D glvnd=enabled \
-D glx=dri \
-D libunwind=enabled \
-D llvm=enabled \
-D lmsensors=disabled \
-D microsoft-clc=disabled \
-D platforms=x11,wayland \
-D valgrind=disabled \
-D video-codecs=all \
-D vulkan-drivers=amd,intel,intel_hasvk,swrast,virtio,nouveau \
-D vulkan-layers=device-select,intel-nullhw,overlay \
-D tools='' \
-D zstd=enabled \
-D buildtype=plain \
-D prefix=/usr \
-D sysconfdir=/etc \
--wrap-mode=nofallback \
--force-fallback-for=syn,paste,rustc-hash \
&& ninja -C _build
# RUN cd mesa/ \
# && source '/1.4.328.1/setup-env.sh' \
# && export CXX='clang++' \
# && export CC='clang' \
# && export CFLAGS="\
# -fsanitize=memory \
# -fsanitize-memory-track-origins \
# -fno-omit-frame-pointer \
# -g" \
# && export CXXFLAGS="\
# -fsanitize=memory \
# -fsanitize-memory-track-origins \
# -fno-omit-frame-pointer \
# -g \
# -nostdinc++ \
# -isystem /libcxx_msan/include/c++/v1/"\
# && export LDFLAGS="\
# -fsanitize=memory \
# -fsanitize-memory-track-origins \
# -g \
# -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \
# -L/msan/lib -Wl,-rpath,/msan/lib \
# -lc++ \
# -lc++abi" \
# && meson setup ./ _build \
# -D build-tests=false \
# -D enable-glcpp-tests=false \
# -D build-radv-tests=false \
# -D build-aco-tests=false \
# -D install-intel-gpu-tests=false \
# -D gallium-mediafoundation-test=false \
# -D android-libbacktrace=disabled \
# -D split-debug=disabled \
# -D b_ndebug=true \
# -D b_lto=false \
# -D egl=enabled \
# -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,softpipe,llvmpipe,i915,iris,crocus,zink \
# -D gallium-extra-hud=true \
# -D gallium-rusticl=true \
# -D gallium-va=enabled \
# -D gbm=enabled \
# -D gles1=disabled \
# -D gles2=enabled \
# -D glvnd=enabled \
# -D glx=dri \
# -D libunwind=enabled \
# -D llvm=enabled \
# -D lmsensors=disabled \
# -D microsoft-clc=disabled \
# -D platforms=x11,wayland \
# -D valgrind=disabled \
# -D video-codecs=all \
# -D vulkan-drivers=amd,intel,intel_hasvk,swrast,virtio,nouveau \
# -D vulkan-layers=device-select,intel-nullhw,overlay \
# -D tools='' \
# -D zstd=enabled \
# -D buildtype=plain \
# -D prefix=/usr \
# -D sysconfdir=/etc \
# --wrap-mode=nofallback \
# --force-fallback-for=syn,paste,rustc-hash \
# && ninja -C _build
#

View file

@ -3,6 +3,8 @@
set -euo pipefail set -euo pipefail
cd "$(git rev-parse --show-toplevel)/" cd "$(git rev-parse --show-toplevel)/"
source '/1.4.328.1/setup-env.sh'
CC=$(which clang) CC=$(which clang)
export CC export CC
@ -12,6 +14,12 @@ export CXX
DISPLAY=:99 DISPLAY=:99
export DISPLAY export DISPLAY
PKG_CONFIG_PATH="/msan/lib/pkgconfig:${PKG_CONFIG_PATH}"
export PKG_CONFIG_PATH
VK_ICD_FILENAMES='/usr/share/vulkan/icd.d/lvp_icd.x86_64.json'
export VK_ICD_FILENAMES
Xvfb :99 -screen 0 1024x768x16 & Xvfb :99 -screen 0 1024x768x16 &
cmake \ cmake \
@ -32,10 +40,12 @@ cmake \
-D CMAKE_EXE_LINKER_FLAGS=" \ -D CMAKE_EXE_LINKER_FLAGS=" \
-fsanitize=memory \ -fsanitize=memory \
-fsanitize-memory-track-origins \ -fsanitize-memory-track-origins \
-L/libcxx_msan/lib \ -g \
-std=c++23 \
-L/msan/lib -Wl,-rpath,/msan/lib \
-L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \
-lc++ \ -lc++ \
-lc++abi \ -lc++abi"
-Wl,-rpath,/libcxx_msan/lib"
cmake --build ./build -j"$(nproc)" cmake --build ./build -j"$(nproc)"

View file

@ -0,0 +1,3 @@
src:*
obj:*
fun:*