Update to latest nxdk_pgraph_tests.
3
.gitmodules
vendored
@@ -1,3 +0,0 @@
|
||||
[submodule "nxdk_pgraph_tests"]
|
||||
path = test-pgraph/nxdk_pgraph_tests
|
||||
url = https://github.com/abaire/nxdk_pgraph_tests.git
|
||||
|
||||
101
Dockerfile
@@ -1,7 +1,10 @@
|
||||
FROM xboxdev/nxdk:latest AS nxdk-base
|
||||
|
||||
|
||||
#
|
||||
# Build test data
|
||||
#
|
||||
FROM ghcr.io/xboxdev/nxdk AS test-xbe-data
|
||||
FROM nxdk-base AS test-xbe-data
|
||||
RUN mkdir /data
|
||||
|
||||
COPY test-xbe /test-xbe
|
||||
@@ -9,48 +12,63 @@ RUN mkdir /data/TestXBE
|
||||
RUN /usr/src/nxdk/docker_entry.sh make -C /test-xbe
|
||||
RUN cp /test-xbe/tester.iso /data/TestXBE/
|
||||
|
||||
# The nxdk_pgraph_tests includes its own copy of the nxdk which needs more build
|
||||
# infrastructure than the nxdk-runbase used for other tests.
|
||||
FROM ubuntu:20.04 AS pgraph-buildbase
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
|
||||
#
|
||||
# Build nxdk_pgraph_tests
|
||||
#
|
||||
FROM nxdk-base AS pgraph-data
|
||||
|
||||
RUN apk add --upgrade --no-cache curl libcurl git
|
||||
|
||||
WORKDIR /work
|
||||
|
||||
RUN mkdir -p /data/TestNXDKPgraphTests
|
||||
RUN curl \
|
||||
-L https://github.com/abaire/nxdk_pgraph_tests/releases/download/v2025-01-23_02-07-06-535990005/nxdk_pgraph_tests_xiso.iso \
|
||||
--output clean_nxdk_pgraph_tests_xiso.iso
|
||||
|
||||
RUN cp /usr/src/nxdk/tools/extract-xiso/build/extract-xiso /bin \
|
||||
&& extract-xiso -x clean_nxdk_pgraph_tests_xiso.iso
|
||||
COPY test-pgraph/config.json clean_nxdk_pgraph_tests_xiso/nxdk_pgraph_tests_config.json
|
||||
RUN extract-xiso -c clean_nxdk_pgraph_tests_xiso nxdk_pgraph_tests_xiso.iso \
|
||||
&& mv nxdk_pgraph_tests_xiso.iso /data/TestNXDKPgraphTests/ \
|
||||
;
|
||||
|
||||
RUN git clone --depth 1 https://github.com/abaire/nxdk_pgraph_tests_golden_results.git /data/TestNXDKPgraphTests/nxdk_pgraph_tests_golden_results
|
||||
|
||||
|
||||
FROM ubuntu:24.10 AS ubuntu-base
|
||||
RUN set -xe; \
|
||||
apt-get -qy update \
|
||||
&& apt-get -qy install \
|
||||
bison \
|
||||
clang \
|
||||
python3-pip \
|
||||
python3-venv \
|
||||
;
|
||||
|
||||
#
|
||||
# Build xemutest module
|
||||
#
|
||||
FROM ubuntu-base AS build-xemutest
|
||||
|
||||
RUN apt-get -qy install \
|
||||
cmake \
|
||||
flex \
|
||||
lld \
|
||||
llvm \
|
||||
make
|
||||
;
|
||||
|
||||
FROM pgraph-buildbase AS pgraph-data
|
||||
RUN mkdir -p /data/TestNXDKPgraphTests
|
||||
COPY test-pgraph /test-pgraph
|
||||
RUN make -C /test-pgraph/nxdk_pgraph_tests \
|
||||
AUTORUN_IMMEDIATELY=y \
|
||||
ENABLE_SHUTDOWN=y \
|
||||
FALLBACK_OUTPUT_ROOT_PATH="c:" \
|
||||
RUNTIME_CONFIG_PATH="c:/pgraph_tests.cnf" \
|
||||
CC=clang CXX=clang++ \
|
||||
-j$(numproc)
|
||||
RUN cp /test-pgraph/nxdk_pgraph_tests/nxdk_pgraph_tests.iso /data/TestNXDKPgraphTests/
|
||||
RUN mv /test-pgraph/config.cnf /data/TestNXDKPgraphTests/
|
||||
RUN mv /test-pgraph/golden_results /data/TestNXDKPgraphTests/
|
||||
WORKDIR /build
|
||||
COPY ./xemutest /work/xemu-test/xemutest/
|
||||
COPY ./setup.py /work/xemu-test
|
||||
RUN python3 -m venv venv \
|
||||
&& . venv/bin/activate \
|
||||
&& pip install /work/xemu-test \
|
||||
;
|
||||
|
||||
# Combine test data
|
||||
FROM scratch AS data
|
||||
COPY --from=test-xbe-data /data /data
|
||||
COPY --from=pgraph-data /data/TestNXDKPgraphTests /data/TestNXDKPgraphTests
|
||||
|
||||
#
|
||||
# Build base test container image
|
||||
#
|
||||
FROM ubuntu:20.04 as run-container-base
|
||||
FROM ubuntu-base AS run-container-base
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN set -xe; \
|
||||
apt-get -qy update \
|
||||
&& apt-get -qy install \
|
||||
RUN apt-get -qy install \
|
||||
python3-pip \
|
||||
xvfb \
|
||||
x11-utils \
|
||||
@@ -69,12 +87,17 @@ RUN set -xe; \
|
||||
libpulse0 \
|
||||
libsamplerate0 \
|
||||
libsdl2-2.0-0 \
|
||||
libssl1.1 \
|
||||
libssl-dev \
|
||||
libstdc++6 \
|
||||
perceptualdiff \
|
||||
zlib1g \
|
||||
;
|
||||
|
||||
# Combine test data
|
||||
FROM scratch AS data
|
||||
COPY --from=test-xbe-data /data /data
|
||||
COPY --from=pgraph-data /data/TestNXDKPgraphTests /data/TestNXDKPgraphTests
|
||||
|
||||
#
|
||||
# Build final test container
|
||||
#
|
||||
@@ -86,13 +109,13 @@ ENV SDL_AUDIODRIVER=dummy
|
||||
|
||||
EXPOSE 5900
|
||||
|
||||
RUN mkdir /work
|
||||
WORKDIR /work
|
||||
|
||||
COPY scripts/docker_entry.sh /docker_entry.sh
|
||||
COPY ./scripts /work/xemu-test/scripts/
|
||||
COPY ./xemutest /work/xemu-test/xemutest/
|
||||
COPY ./setup.py /work/xemu-test
|
||||
COPY --from=data /data /work/xemu-test/xemutest/data
|
||||
RUN pip install /work/xemu-test
|
||||
COPY --from=data /data /work/xemu-test/data
|
||||
COPY --from=build-xemutest /build/venv /venv
|
||||
|
||||
ENTRYPOINT ["/docker_entry.sh"]
|
||||
CMD ["/usr/bin/python3", "-m", "xemutest", "/work/private", "/work/results"]
|
||||
|
||||
CMD ["/venv/bin/python3", "-m", "xemutest", "--data", "/work/xemu-test/data", "/work/private", "/work/results"]
|
||||
|
||||
12
README.md
@@ -28,12 +28,12 @@ that image for testing:
|
||||
|
||||
Set up the following dir structure:
|
||||
|
||||
- /work/results: Results will be copied here
|
||||
- /work/private: Directory for ROMs and other files
|
||||
- /work/private/mcpx.bin
|
||||
- /work/private/bios.bin
|
||||
- /work/inputs: Directory containing xemu build to test
|
||||
- /work/xemu.deb
|
||||
- `/work/results`: Results will be copied here
|
||||
- `/work/private`: Directory for ROMs and other files
|
||||
- `/work/private/mcpx.bin`
|
||||
- `/work/private/bios.bin`
|
||||
- `/work/inputs`: Directory containing xemu build to test
|
||||
- `/work/xemu.deb` or `/work/xemu.AppImage`
|
||||
|
||||
Then run with something like:
|
||||
|
||||
|
||||
@@ -10,8 +10,27 @@ if [ $# -eq 0 ]; then
|
||||
fi
|
||||
|
||||
set -e
|
||||
echo "[*] Installing xemu package"
|
||||
apt-get -qy install /work/inputs/xemu.deb
|
||||
if [[ -e /work/inputs/xemu.deb ]]; then
|
||||
echo "[*] Installing xemu package"
|
||||
apt-get -qy install /work/inputs/xemu.deb
|
||||
else
|
||||
appimage_file="$(find /work/inputs -name "*.AppImage" -print0 \
|
||||
| sort -zV \
|
||||
| tail -zn 1 \
|
||||
| tr -d '\0')"
|
||||
readonly appimage_file
|
||||
|
||||
if [[ "${appimage_file:+x}" != "x" ]]; then
|
||||
echo "No .deb or .AppImage found in /work/inputs."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[*] Using xemu from ${appimage_file}"
|
||||
|
||||
chmod +x "${appimage_file}"
|
||||
"${appimage_file}" --appimage-extract > /dev/null 2>&1
|
||||
export PATH="$PWD/squashfs-root/usr/bin:${PATH}"
|
||||
fi
|
||||
|
||||
echo "exec i3" >> ~/.xinitrc
|
||||
chmod +x ~/.xinitrc
|
||||
|
||||
6
setup.py
@@ -2,7 +2,7 @@
|
||||
from setuptools import setup
|
||||
|
||||
|
||||
__version__ = '0.0.6'
|
||||
__version__ = '0.0.7'
|
||||
|
||||
|
||||
setup(name='xemutest',
|
||||
@@ -10,12 +10,12 @@ setup(name='xemutest',
|
||||
description='xemu Automated Tests',
|
||||
author='Matt Borgerson',
|
||||
author_email='contact@mborgerson.com',
|
||||
url='https://github.com/mborgerson/xemu-test',
|
||||
url='https://github.com/xemu-project/xemu-test',
|
||||
packages=['xemutest'],
|
||||
include_package_data=True,
|
||||
package_data={'xemutest': ['data/**/*']},
|
||||
install_requires=[
|
||||
'pyfatx >= 0.0.6',
|
||||
'pyfatx >= 0.0.7',
|
||||
'pywinauto; sys_platform == "win32"'
|
||||
],
|
||||
python_requires='>=3.6'
|
||||
|
||||
@@ -1,27 +1,13 @@
|
||||
# test-pgraph
|
||||
|
||||
Runs the [nxdk_pgraph_tests](https://github.com/abaire/nxdk_pgraph_tests) suite and
|
||||
Runs the [nxdk_pgraph_tests](https://github.com/abaire/nxdk_pgraph_tests) suite
|
||||
and
|
||||
validates the generated images against golden expectation files.
|
||||
|
||||
# Configuration
|
||||
|
||||
The subset of `nxdk_pgraph_tests` that will be executed is determined by the
|
||||
`config.cnf` file in this directory. A default version of this file may be generated
|
||||
using the appropriate build flag in the `nxdk_pgraph_tests` project and then copied
|
||||
from the HDD. See the relevant build parameter in the Makefile to trigger config file
|
||||
generation.
|
||||
`config.json` file in this directory. See
|
||||
the [nxdk_pgraph_tests README](https://github.com/abaire/nxdk_pgraph_tests#readme)
|
||||
for details on this file.
|
||||
|
||||
# Adding golden_results
|
||||
|
||||
Expected outputs are placed into the `golden_results` directory. It is extremely
|
||||
important that the files in these directories capture the expected results,
|
||||
which may be different from the output. To facilitate this, the results from
|
||||
running on hardware may be used
|
||||
[from this repository](https://github.com/abaire/nxdk_pgraph_tests_golden_results).
|
||||
|
||||
[This example script](https://gist.github.com/abaire/f566977419b3b3eb0537d3b4246de22f)
|
||||
compares the output of a `xemu-test` CI run against the HW results, generating
|
||||
diff files for any results that differ significantly. Note that minor,
|
||||
imperceptible differences are expected, so
|
||||
[perceptualdiff](https://github.com/myint/perceptualdiff) is used so that only
|
||||
significant differences are flagged.
|
||||
|
||||
@@ -1,878 +0,0 @@
|
||||
# pgraph test suite configuration
|
||||
|
||||
Lighting normals
|
||||
# NoNormal
|
||||
# NoNormal-inlinearrays
|
||||
# NoNormal-inlinebuf
|
||||
# NoNormal-inlineelements
|
||||
# Nz_-100
|
||||
# Nz_-100-inlinearrays
|
||||
# Nz_-100-inlinebuf
|
||||
# Nz_-100-inlineelements
|
||||
# Nz_0
|
||||
# Nz_0-inlinearrays
|
||||
# Nz_0-inlinebuf
|
||||
# Nz_0-inlineelements
|
||||
# Nz_100
|
||||
# Nz_100-inlinearrays
|
||||
# Nz_100-inlinebuf
|
||||
# Nz_100-inlineelements
|
||||
# Nz_31
|
||||
# Nz_31-inlinearrays
|
||||
# Nz_31-inlinebuf
|
||||
# Nz_31-inlineelements
|
||||
# Nz_70
|
||||
# Nz_70-inlinearrays
|
||||
# Nz_70-inlinebuf
|
||||
# Nz_70-inlineelements
|
||||
# Nz_97
|
||||
# Nz_97-inlinearrays
|
||||
# Nz_97-inlinebuf
|
||||
# Nz_97-inlineelements
|
||||
|
||||
#Attrib carryover
|
||||
# L-d0.0_0.0_1.0_1.0-da
|
||||
# L-d0.2_0.0_0.6_1.0-ie
|
||||
# L-d0.5_0.0_0.0_1.0-ia
|
||||
# L-d0.8_0.0_0.0_1.0-ib
|
||||
# L-n0.0_0.0_1.0_1.0-da
|
||||
# L-n0.2_0.0_0.6_1.0-ie
|
||||
# L-n0.5_0.0_0.0_1.0-ia
|
||||
# L-n0.8_0.0_0.0_1.0-ib
|
||||
# L-s0.0_0.0_1.0_1.0-da
|
||||
# L-s0.2_0.0_0.6_1.0-ie
|
||||
# L-s0.5_0.0_0.0_1.0-ia
|
||||
# L-s0.8_0.0_0.0_1.0-ib
|
||||
# L-t00.0_0.0_1.0_1.0-da
|
||||
# L-t00.2_0.0_0.6_1.0-ie
|
||||
# L-t00.5_0.0_0.0_1.0-ia
|
||||
# L-t00.8_0.0_0.0_1.0-ib
|
||||
# L-t10.0_0.0_1.0_1.0-da
|
||||
# L-t10.2_0.0_0.6_1.0-ie
|
||||
# L-t10.5_0.0_0.0_1.0-ia
|
||||
# L-t10.8_0.0_0.0_1.0-ib
|
||||
# L-t20.0_0.0_1.0_1.0-da
|
||||
# L-t20.2_0.0_0.6_1.0-ie
|
||||
# L-t20.5_0.0_0.0_1.0-ia
|
||||
# L-t20.8_0.0_0.0_1.0-ib
|
||||
# L-t30.0_0.0_1.0_1.0-da
|
||||
# L-t30.2_0.0_0.6_1.0-ie
|
||||
# L-t30.5_0.0_0.0_1.0-ia
|
||||
# L-t30.8_0.0_0.0_1.0-ib
|
||||
# T-d0.0_0.0_1.0_1.0-da
|
||||
# T-d0.2_0.0_0.6_1.0-ie
|
||||
# T-d0.5_0.0_0.0_1.0-ia
|
||||
# T-d0.8_0.0_0.0_1.0-ib
|
||||
# T-n0.0_0.0_1.0_1.0-da
|
||||
# T-n0.2_0.0_0.6_1.0-ie
|
||||
# T-n0.5_0.0_0.0_1.0-ia
|
||||
# T-n0.8_0.0_0.0_1.0-ib
|
||||
# T-s0.0_0.0_1.0_1.0-da
|
||||
# T-s0.2_0.0_0.6_1.0-ie
|
||||
# T-s0.5_0.0_0.0_1.0-ia
|
||||
# T-s0.8_0.0_0.0_1.0-ib
|
||||
# T-t00.0_0.0_1.0_1.0-da
|
||||
# T-t00.2_0.0_0.6_1.0-ie
|
||||
# T-t00.5_0.0_0.0_1.0-ia
|
||||
# T-t00.8_0.0_0.0_1.0-ib
|
||||
# T-t10.0_0.0_1.0_1.0-da
|
||||
# T-t10.2_0.0_0.6_1.0-ie
|
||||
# T-t10.5_0.0_0.0_1.0-ia
|
||||
# T-t10.8_0.0_0.0_1.0-ib
|
||||
# T-t20.0_0.0_1.0_1.0-da
|
||||
# T-t20.2_0.0_0.6_1.0-ie
|
||||
# T-t20.5_0.0_0.0_1.0-ia
|
||||
# T-t20.8_0.0_0.0_1.0-ib
|
||||
# T-t30.0_0.0_1.0_1.0-da
|
||||
# T-t30.2_0.0_0.6_1.0-ie
|
||||
# T-t30.5_0.0_0.0_1.0-ia
|
||||
# T-t30.8_0.0_0.0_1.0-ib
|
||||
|
||||
#Attrib setter
|
||||
# Setters-alpha
|
||||
# Setters-visible
|
||||
|
||||
#Clear
|
||||
# C00000000_Depth_n
|
||||
# C00000000_Depth_y
|
||||
# C00000001_Depth_n
|
||||
# C00000001_Depth_y
|
||||
# C00000100_Depth_n
|
||||
# C00000100_Depth_y
|
||||
# C00010000_Depth_n
|
||||
# C00010000_Depth_y
|
||||
# C01000000_Depth_n
|
||||
# C01000000_Depth_y
|
||||
# C01010101_Depth_n
|
||||
# C01010101_Depth_y
|
||||
|
||||
#Color zeta overlap
|
||||
# ColorIntoZeta
|
||||
# Swap
|
||||
# ZetaIntoColor
|
||||
|
||||
#Combiner
|
||||
# Flags
|
||||
# Independence
|
||||
# Mux
|
||||
|
||||
#Fog
|
||||
# AFF-exp-planar
|
||||
# AFF-exp2-planar
|
||||
# AFF-exp2_abs-planar
|
||||
# AFF-exp_abs-planar
|
||||
# AFF-linear-planar
|
||||
# AFF-linear_abs-planar
|
||||
|
||||
#Fog vsh
|
||||
# AFF-exp-planar
|
||||
# AFF-exp2-planar
|
||||
# AFF-exp2_abs-planar
|
||||
# AFF-exp_abs-planar
|
||||
# AFF-linear-planar
|
||||
# AFF-linear_abs-planar
|
||||
|
||||
#Fog inf coord
|
||||
# AFF-exp-planar
|
||||
# AFF-exp2-planar
|
||||
# AFF-exp2_abs-planar
|
||||
# AFF-exp_abs-planar
|
||||
# AFF-linear-planar
|
||||
# AFF-linear_abs-planar
|
||||
|
||||
#Fog coord vec4
|
||||
# W-0.00_0.25_0.00_0.00
|
||||
# W-0.30_0.30_0.30_1.00
|
||||
# W-0.50_0.50_0.00_0.00
|
||||
# W-1.00_0.00_0.00_0.50
|
||||
# WX-0.25_0.00_0.00_0.50
|
||||
# WX-0.65_0.00_0.00_0.00
|
||||
# WY-0.00_0.75_0.75_0.25
|
||||
# WY-1.00_0.00_1.00_0.75
|
||||
# WZYX-0.25_0.50_0.75_1.00
|
||||
# WZYX-1.00_0.75_0.50_0.25
|
||||
# X-0.00_0.00_0.00_0.00
|
||||
# X-0.90_0.00_0.00_0.00
|
||||
# XYZW-0.00_0.33_0.66_0.90
|
||||
# XYZW-1.00_0.25_0.75_0.50
|
||||
# Y-0.00_0.00_0.00_0.00
|
||||
# Y-0.00_0.10_0.00_0.00
|
||||
# Y-0.00_0.60_0.00_0.00
|
||||
# Z-0.00_0.00_0.00_0.00
|
||||
# Z-0.00_0.00_0.20_0.00
|
||||
# Z-0.00_0.00_0.80_0.00
|
||||
|
||||
#Front face
|
||||
# FrontFace_0_CF_B
|
||||
# FrontFace_0_CF_F
|
||||
# FrontFace_0_CF_FaB
|
||||
# FrontFace_63_CF_B
|
||||
# FrontFace_63_CF_F
|
||||
# FrontFace_63_CF_FaB
|
||||
# FrontFace_CCW_CF_B
|
||||
# FrontFace_CCW_CF_F
|
||||
# FrontFace_CCW_CF_FaB
|
||||
# FrontFace_CW_CF_B
|
||||
# FrontFace_CW_CF_F
|
||||
# FrontFace_CW_CF_FaB
|
||||
|
||||
#Depth buffer
|
||||
# DepthFmt_z16_Cn_FZn_M00003f
|
||||
# DepthFmt_z16_Cn_FZn_M00043e
|
||||
# DepthFmt_z16_Cn_FZn_M00083d
|
||||
# DepthFmt_z16_Cn_FZn_M000c3c
|
||||
# DepthFmt_z16_Cn_FZn_M00103b
|
||||
# DepthFmt_z16_Cn_FZn_M00143a
|
||||
# DepthFmt_z16_Cn_FZn_M001839
|
||||
# DepthFmt_z16_Cn_FZn_M001c38
|
||||
# DepthFmt_z16_Cn_FZn_M002037
|
||||
# DepthFmt_z16_Cn_FZn_M002436
|
||||
# DepthFmt_z16_Cn_FZn_M002835
|
||||
# DepthFmt_z16_Cn_FZn_M002c34
|
||||
# DepthFmt_z16_Cn_FZn_M003033
|
||||
# DepthFmt_z16_Cn_FZn_M003432
|
||||
# DepthFmt_z16_Cn_FZn_M003831
|
||||
# DepthFmt_z16_Cn_FZn_M003c30
|
||||
# DepthFmt_z16_Cn_FZn_M00402f
|
||||
# DepthFmt_z16_Cn_FZn_M00442e
|
||||
# DepthFmt_z16_Cn_FZn_M00482d
|
||||
# DepthFmt_z16_Cn_FZn_M004c2c
|
||||
# DepthFmt_z16_Cn_FZn_M00502b
|
||||
# DepthFmt_z16_Cn_FZn_M00542a
|
||||
# DepthFmt_z16_Cn_FZn_M005829
|
||||
# DepthFmt_z16_Cn_FZn_M005c28
|
||||
# DepthFmt_z16_Cn_FZn_M006027
|
||||
# DepthFmt_z16_Cn_FZn_M006426
|
||||
# DepthFmt_z16_Cn_FZn_M006825
|
||||
# DepthFmt_z16_Cn_FZn_M006c24
|
||||
# DepthFmt_z16_Cn_FZn_M007023
|
||||
# DepthFmt_z16_Cn_FZn_M007422
|
||||
# DepthFmt_z16_Cn_FZn_M007821
|
||||
# DepthFmt_z16_Cn_FZn_M007c20
|
||||
# DepthFmt_z16_Cn_FZn_M00801f
|
||||
# DepthFmt_z16_Cn_FZn_M00841e
|
||||
# DepthFmt_z16_Cn_FZn_M00881d
|
||||
# DepthFmt_z16_Cn_FZn_M008c1c
|
||||
# DepthFmt_z16_Cn_FZn_M00901b
|
||||
# DepthFmt_z16_Cn_FZn_M00941a
|
||||
# DepthFmt_z16_Cn_FZn_M009819
|
||||
# DepthFmt_z16_Cn_FZn_M009c18
|
||||
# DepthFmt_z16_Cn_FZn_M00a017
|
||||
# DepthFmt_z16_Cn_FZn_M00a416
|
||||
# DepthFmt_z16_Cn_FZn_M00a815
|
||||
# DepthFmt_z16_Cn_FZn_M00ac14
|
||||
# DepthFmt_z16_Cn_FZn_M00b013
|
||||
# DepthFmt_z16_Cn_FZn_M00b412
|
||||
# DepthFmt_z16_Cn_FZn_M00b811
|
||||
# DepthFmt_z16_Cn_FZn_M00bc10
|
||||
# DepthFmt_z16_Cn_FZn_M00c00f
|
||||
# DepthFmt_z16_Cn_FZn_M00c40e
|
||||
# DepthFmt_z16_Cn_FZn_M00c80d
|
||||
# DepthFmt_z16_Cn_FZn_M00cc0c
|
||||
# DepthFmt_z16_Cn_FZn_M00d00b
|
||||
# DepthFmt_z16_Cn_FZn_M00d40a
|
||||
# DepthFmt_z16_Cn_FZn_M00d809
|
||||
# DepthFmt_z16_Cn_FZn_M00dc08
|
||||
# DepthFmt_z16_Cn_FZn_M00e007
|
||||
# DepthFmt_z16_Cn_FZn_M00e406
|
||||
# DepthFmt_z16_Cn_FZn_M00e805
|
||||
# DepthFmt_z16_Cn_FZn_M00ec04
|
||||
# DepthFmt_z16_Cn_FZn_M00f003
|
||||
# DepthFmt_z16_Cn_FZn_M00f402
|
||||
# DepthFmt_z16_Cn_FZn_M00f801
|
||||
# DepthFmt_z16_Cn_FZn_M00fc00
|
||||
# DepthFmt_z16_Cn_FZn_M00ffff
|
||||
# DepthFmt_z16_Cn_FZy_M00003f
|
||||
# DepthFmt_z16_Cn_FZy_M00043e
|
||||
# DepthFmt_z16_Cn_FZy_M00083d
|
||||
# DepthFmt_z16_Cn_FZy_M000c3c
|
||||
# DepthFmt_z16_Cn_FZy_M00103b
|
||||
# DepthFmt_z16_Cn_FZy_M00143a
|
||||
# DepthFmt_z16_Cn_FZy_M001839
|
||||
# DepthFmt_z16_Cn_FZy_M001c38
|
||||
# DepthFmt_z16_Cn_FZy_M002037
|
||||
# DepthFmt_z16_Cn_FZy_M002436
|
||||
# DepthFmt_z16_Cn_FZy_M002835
|
||||
# DepthFmt_z16_Cn_FZy_M002c34
|
||||
# DepthFmt_z16_Cn_FZy_M003033
|
||||
# DepthFmt_z16_Cn_FZy_M003432
|
||||
# DepthFmt_z16_Cn_FZy_M003831
|
||||
# DepthFmt_z16_Cn_FZy_M003c30
|
||||
# DepthFmt_z16_Cn_FZy_M00402f
|
||||
# DepthFmt_z16_Cn_FZy_M00442e
|
||||
# DepthFmt_z16_Cn_FZy_M00482d
|
||||
# DepthFmt_z16_Cn_FZy_M004c2c
|
||||
# DepthFmt_z16_Cn_FZy_M00502b
|
||||
# DepthFmt_z16_Cn_FZy_M00542a
|
||||
# DepthFmt_z16_Cn_FZy_M005829
|
||||
# DepthFmt_z16_Cn_FZy_M005c28
|
||||
# DepthFmt_z16_Cn_FZy_M006027
|
||||
# DepthFmt_z16_Cn_FZy_M006426
|
||||
# DepthFmt_z16_Cn_FZy_M006825
|
||||
# DepthFmt_z16_Cn_FZy_M006c24
|
||||
# DepthFmt_z16_Cn_FZy_M007023
|
||||
# DepthFmt_z16_Cn_FZy_M007422
|
||||
# DepthFmt_z16_Cn_FZy_M007821
|
||||
# DepthFmt_z16_Cn_FZy_M007c20
|
||||
# DepthFmt_z16_Cn_FZy_M00801f
|
||||
# DepthFmt_z16_Cn_FZy_M00841e
|
||||
# DepthFmt_z16_Cn_FZy_M00881d
|
||||
# DepthFmt_z16_Cn_FZy_M008c1c
|
||||
# DepthFmt_z16_Cn_FZy_M00901b
|
||||
# DepthFmt_z16_Cn_FZy_M00941a
|
||||
# DepthFmt_z16_Cn_FZy_M009819
|
||||
# DepthFmt_z16_Cn_FZy_M009c18
|
||||
# DepthFmt_z16_Cn_FZy_M00a017
|
||||
# DepthFmt_z16_Cn_FZy_M00a416
|
||||
# DepthFmt_z16_Cn_FZy_M00a815
|
||||
# DepthFmt_z16_Cn_FZy_M00ac14
|
||||
# DepthFmt_z16_Cn_FZy_M00b013
|
||||
# DepthFmt_z16_Cn_FZy_M00b412
|
||||
# DepthFmt_z16_Cn_FZy_M00b811
|
||||
# DepthFmt_z16_Cn_FZy_M00bc10
|
||||
# DepthFmt_z16_Cn_FZy_M00c00f
|
||||
# DepthFmt_z16_Cn_FZy_M00c40e
|
||||
# DepthFmt_z16_Cn_FZy_M00c80d
|
||||
# DepthFmt_z16_Cn_FZy_M00cc0c
|
||||
# DepthFmt_z16_Cn_FZy_M00d00b
|
||||
# DepthFmt_z16_Cn_FZy_M00d40a
|
||||
# DepthFmt_z16_Cn_FZy_M00d809
|
||||
# DepthFmt_z16_Cn_FZy_M00dc08
|
||||
# DepthFmt_z16_Cn_FZy_M00e007
|
||||
# DepthFmt_z16_Cn_FZy_M00e406
|
||||
# DepthFmt_z16_Cn_FZy_M00e805
|
||||
# DepthFmt_z16_Cn_FZy_M00ec04
|
||||
# DepthFmt_z16_Cn_FZy_M00f003
|
||||
# DepthFmt_z16_Cn_FZy_M00f402
|
||||
# DepthFmt_z16_Cn_FZy_M00f801
|
||||
# DepthFmt_z16_Cn_FZy_M00fc00
|
||||
# DepthFmt_z16_Cn_FZy_M00ffff
|
||||
# DepthFmt_z16_Cy_FZn_M00003f
|
||||
# DepthFmt_z16_Cy_FZn_M00043e
|
||||
# DepthFmt_z16_Cy_FZn_M00083d
|
||||
# DepthFmt_z16_Cy_FZn_M000c3c
|
||||
# DepthFmt_z16_Cy_FZn_M00103b
|
||||
# DepthFmt_z16_Cy_FZn_M00143a
|
||||
# DepthFmt_z16_Cy_FZn_M001839
|
||||
# DepthFmt_z16_Cy_FZn_M001c38
|
||||
# DepthFmt_z16_Cy_FZn_M002037
|
||||
# DepthFmt_z16_Cy_FZn_M002436
|
||||
# DepthFmt_z16_Cy_FZn_M002835
|
||||
# DepthFmt_z16_Cy_FZn_M002c34
|
||||
# DepthFmt_z16_Cy_FZn_M003033
|
||||
# DepthFmt_z16_Cy_FZn_M003432
|
||||
# DepthFmt_z16_Cy_FZn_M003831
|
||||
# DepthFmt_z16_Cy_FZn_M003c30
|
||||
# DepthFmt_z16_Cy_FZn_M00402f
|
||||
# DepthFmt_z16_Cy_FZn_M00442e
|
||||
# DepthFmt_z16_Cy_FZn_M00482d
|
||||
# DepthFmt_z16_Cy_FZn_M004c2c
|
||||
# DepthFmt_z16_Cy_FZn_M00502b
|
||||
# DepthFmt_z16_Cy_FZn_M00542a
|
||||
# DepthFmt_z16_Cy_FZn_M005829
|
||||
# DepthFmt_z16_Cy_FZn_M005c28
|
||||
# DepthFmt_z16_Cy_FZn_M006027
|
||||
# DepthFmt_z16_Cy_FZn_M006426
|
||||
# DepthFmt_z16_Cy_FZn_M006825
|
||||
# DepthFmt_z16_Cy_FZn_M006c24
|
||||
# DepthFmt_z16_Cy_FZn_M007023
|
||||
# DepthFmt_z16_Cy_FZn_M007422
|
||||
# DepthFmt_z16_Cy_FZn_M007821
|
||||
# DepthFmt_z16_Cy_FZn_M007c20
|
||||
# DepthFmt_z16_Cy_FZn_M00801f
|
||||
# DepthFmt_z16_Cy_FZn_M00841e
|
||||
# DepthFmt_z16_Cy_FZn_M00881d
|
||||
# DepthFmt_z16_Cy_FZn_M008c1c
|
||||
# DepthFmt_z16_Cy_FZn_M00901b
|
||||
# DepthFmt_z16_Cy_FZn_M00941a
|
||||
# DepthFmt_z16_Cy_FZn_M009819
|
||||
# DepthFmt_z16_Cy_FZn_M009c18
|
||||
# DepthFmt_z16_Cy_FZn_M00a017
|
||||
# DepthFmt_z16_Cy_FZn_M00a416
|
||||
# DepthFmt_z16_Cy_FZn_M00a815
|
||||
# DepthFmt_z16_Cy_FZn_M00ac14
|
||||
# DepthFmt_z16_Cy_FZn_M00b013
|
||||
# DepthFmt_z16_Cy_FZn_M00b412
|
||||
# DepthFmt_z16_Cy_FZn_M00b811
|
||||
# DepthFmt_z16_Cy_FZn_M00bc10
|
||||
# DepthFmt_z16_Cy_FZn_M00c00f
|
||||
# DepthFmt_z16_Cy_FZn_M00c40e
|
||||
# DepthFmt_z16_Cy_FZn_M00c80d
|
||||
# DepthFmt_z16_Cy_FZn_M00cc0c
|
||||
# DepthFmt_z16_Cy_FZn_M00d00b
|
||||
# DepthFmt_z16_Cy_FZn_M00d40a
|
||||
# DepthFmt_z16_Cy_FZn_M00d809
|
||||
# DepthFmt_z16_Cy_FZn_M00dc08
|
||||
# DepthFmt_z16_Cy_FZn_M00e007
|
||||
# DepthFmt_z16_Cy_FZn_M00e406
|
||||
# DepthFmt_z16_Cy_FZn_M00e805
|
||||
# DepthFmt_z16_Cy_FZn_M00ec04
|
||||
# DepthFmt_z16_Cy_FZn_M00f003
|
||||
# DepthFmt_z16_Cy_FZn_M00f402
|
||||
# DepthFmt_z16_Cy_FZn_M00f801
|
||||
# DepthFmt_z16_Cy_FZn_M00fc00
|
||||
# DepthFmt_z16_Cy_FZn_M00ffff
|
||||
# DepthFmt_z16_Cy_FZy_M00003f
|
||||
# DepthFmt_z16_Cy_FZy_M00043e
|
||||
# DepthFmt_z16_Cy_FZy_M00083d
|
||||
# DepthFmt_z16_Cy_FZy_M000c3c
|
||||
# DepthFmt_z16_Cy_FZy_M00103b
|
||||
# DepthFmt_z16_Cy_FZy_M00143a
|
||||
# DepthFmt_z16_Cy_FZy_M001839
|
||||
# DepthFmt_z16_Cy_FZy_M001c38
|
||||
# DepthFmt_z16_Cy_FZy_M002037
|
||||
# DepthFmt_z16_Cy_FZy_M002436
|
||||
# DepthFmt_z16_Cy_FZy_M002835
|
||||
# DepthFmt_z16_Cy_FZy_M002c34
|
||||
# DepthFmt_z16_Cy_FZy_M003033
|
||||
# DepthFmt_z16_Cy_FZy_M003432
|
||||
# DepthFmt_z16_Cy_FZy_M003831
|
||||
# DepthFmt_z16_Cy_FZy_M003c30
|
||||
# DepthFmt_z16_Cy_FZy_M00402f
|
||||
# DepthFmt_z16_Cy_FZy_M00442e
|
||||
# DepthFmt_z16_Cy_FZy_M00482d
|
||||
# DepthFmt_z16_Cy_FZy_M004c2c
|
||||
# DepthFmt_z16_Cy_FZy_M00502b
|
||||
# DepthFmt_z16_Cy_FZy_M00542a
|
||||
# DepthFmt_z16_Cy_FZy_M005829
|
||||
# DepthFmt_z16_Cy_FZy_M005c28
|
||||
# DepthFmt_z16_Cy_FZy_M006027
|
||||
# DepthFmt_z16_Cy_FZy_M006426
|
||||
# DepthFmt_z16_Cy_FZy_M006825
|
||||
# DepthFmt_z16_Cy_FZy_M006c24
|
||||
# DepthFmt_z16_Cy_FZy_M007023
|
||||
# DepthFmt_z16_Cy_FZy_M007422
|
||||
# DepthFmt_z16_Cy_FZy_M007821
|
||||
# DepthFmt_z16_Cy_FZy_M007c20
|
||||
# DepthFmt_z16_Cy_FZy_M00801f
|
||||
# DepthFmt_z16_Cy_FZy_M00841e
|
||||
# DepthFmt_z16_Cy_FZy_M00881d
|
||||
# DepthFmt_z16_Cy_FZy_M008c1c
|
||||
# DepthFmt_z16_Cy_FZy_M00901b
|
||||
# DepthFmt_z16_Cy_FZy_M00941a
|
||||
# DepthFmt_z16_Cy_FZy_M009819
|
||||
# DepthFmt_z16_Cy_FZy_M009c18
|
||||
# DepthFmt_z16_Cy_FZy_M00a017
|
||||
# DepthFmt_z16_Cy_FZy_M00a416
|
||||
# DepthFmt_z16_Cy_FZy_M00a815
|
||||
# DepthFmt_z16_Cy_FZy_M00ac14
|
||||
# DepthFmt_z16_Cy_FZy_M00b013
|
||||
# DepthFmt_z16_Cy_FZy_M00b412
|
||||
# DepthFmt_z16_Cy_FZy_M00b811
|
||||
# DepthFmt_z16_Cy_FZy_M00bc10
|
||||
# DepthFmt_z16_Cy_FZy_M00c00f
|
||||
# DepthFmt_z16_Cy_FZy_M00c40e
|
||||
# DepthFmt_z16_Cy_FZy_M00c80d
|
||||
# DepthFmt_z16_Cy_FZy_M00cc0c
|
||||
# DepthFmt_z16_Cy_FZy_M00d00b
|
||||
# DepthFmt_z16_Cy_FZy_M00d40a
|
||||
# DepthFmt_z16_Cy_FZy_M00d809
|
||||
# DepthFmt_z16_Cy_FZy_M00dc08
|
||||
# DepthFmt_z16_Cy_FZy_M00e007
|
||||
# DepthFmt_z16_Cy_FZy_M00e406
|
||||
# DepthFmt_z16_Cy_FZy_M00e805
|
||||
# DepthFmt_z16_Cy_FZy_M00ec04
|
||||
# DepthFmt_z16_Cy_FZy_M00f003
|
||||
# DepthFmt_z16_Cy_FZy_M00f402
|
||||
# DepthFmt_z16_Cy_FZy_M00f801
|
||||
# DepthFmt_z16_Cy_FZy_M00fc00
|
||||
# DepthFmt_z16_Cy_FZy_M00ffff
|
||||
# DepthFmt_z24_Cn_FZn_M00003f
|
||||
# DepthFmt_z24_Cn_FZn_M04003e
|
||||
# DepthFmt_z24_Cn_FZn_M08003d
|
||||
# DepthFmt_z24_Cn_FZn_M0c003c
|
||||
# DepthFmt_z24_Cn_FZn_M10003b
|
||||
# DepthFmt_z24_Cn_FZn_M14003a
|
||||
# DepthFmt_z24_Cn_FZn_M180039
|
||||
# DepthFmt_z24_Cn_FZn_M1c0038
|
||||
# DepthFmt_z24_Cn_FZn_M200037
|
||||
# DepthFmt_z24_Cn_FZn_M240036
|
||||
# DepthFmt_z24_Cn_FZn_M280035
|
||||
# DepthFmt_z24_Cn_FZn_M2c0034
|
||||
# DepthFmt_z24_Cn_FZn_M300033
|
||||
# DepthFmt_z24_Cn_FZn_M340032
|
||||
# DepthFmt_z24_Cn_FZn_M380031
|
||||
# DepthFmt_z24_Cn_FZn_M3c0030
|
||||
# DepthFmt_z24_Cn_FZn_M40002f
|
||||
# DepthFmt_z24_Cn_FZn_M44002e
|
||||
# DepthFmt_z24_Cn_FZn_M48002d
|
||||
# DepthFmt_z24_Cn_FZn_M4c002c
|
||||
# DepthFmt_z24_Cn_FZn_M50002b
|
||||
# DepthFmt_z24_Cn_FZn_M54002a
|
||||
# DepthFmt_z24_Cn_FZn_M580029
|
||||
# DepthFmt_z24_Cn_FZn_M5c0028
|
||||
# DepthFmt_z24_Cn_FZn_M600027
|
||||
# DepthFmt_z24_Cn_FZn_M640026
|
||||
# DepthFmt_z24_Cn_FZn_M680025
|
||||
# DepthFmt_z24_Cn_FZn_M6c0024
|
||||
# DepthFmt_z24_Cn_FZn_M700023
|
||||
# DepthFmt_z24_Cn_FZn_M740022
|
||||
# DepthFmt_z24_Cn_FZn_M780021
|
||||
# DepthFmt_z24_Cn_FZn_M7c0020
|
||||
# DepthFmt_z24_Cn_FZn_M80001f
|
||||
# DepthFmt_z24_Cn_FZn_M84001e
|
||||
# DepthFmt_z24_Cn_FZn_M88001d
|
||||
# DepthFmt_z24_Cn_FZn_M8c001c
|
||||
# DepthFmt_z24_Cn_FZn_M90001b
|
||||
# DepthFmt_z24_Cn_FZn_M94001a
|
||||
# DepthFmt_z24_Cn_FZn_M980019
|
||||
# DepthFmt_z24_Cn_FZn_M9c0018
|
||||
# DepthFmt_z24_Cn_FZn_Ma00017
|
||||
# DepthFmt_z24_Cn_FZn_Ma40016
|
||||
# DepthFmt_z24_Cn_FZn_Ma80015
|
||||
# DepthFmt_z24_Cn_FZn_Mac0014
|
||||
# DepthFmt_z24_Cn_FZn_Mb00013
|
||||
# DepthFmt_z24_Cn_FZn_Mb40012
|
||||
# DepthFmt_z24_Cn_FZn_Mb80011
|
||||
# DepthFmt_z24_Cn_FZn_Mbc0010
|
||||
# DepthFmt_z24_Cn_FZn_Mc0000f
|
||||
# DepthFmt_z24_Cn_FZn_Mc4000e
|
||||
# DepthFmt_z24_Cn_FZn_Mc8000d
|
||||
# DepthFmt_z24_Cn_FZn_Mcc000c
|
||||
# DepthFmt_z24_Cn_FZn_Md0000b
|
||||
# DepthFmt_z24_Cn_FZn_Md4000a
|
||||
# DepthFmt_z24_Cn_FZn_Md80009
|
||||
# DepthFmt_z24_Cn_FZn_Mdc0008
|
||||
# DepthFmt_z24_Cn_FZn_Me00007
|
||||
# DepthFmt_z24_Cn_FZn_Me40006
|
||||
# DepthFmt_z24_Cn_FZn_Me80005
|
||||
# DepthFmt_z24_Cn_FZn_Mec0004
|
||||
# DepthFmt_z24_Cn_FZn_Mf00003
|
||||
# DepthFmt_z24_Cn_FZn_Mf40002
|
||||
# DepthFmt_z24_Cn_FZn_Mf80001
|
||||
# DepthFmt_z24_Cn_FZn_Mfc0000
|
||||
# DepthFmt_z24_Cn_FZn_Mffffff
|
||||
# DepthFmt_z24_Cy_FZn_M00003f
|
||||
# DepthFmt_z24_Cy_FZn_M04003e
|
||||
# DepthFmt_z24_Cy_FZn_M08003d
|
||||
# DepthFmt_z24_Cy_FZn_M0c003c
|
||||
# DepthFmt_z24_Cy_FZn_M10003b
|
||||
# DepthFmt_z24_Cy_FZn_M14003a
|
||||
# DepthFmt_z24_Cy_FZn_M180039
|
||||
# DepthFmt_z24_Cy_FZn_M1c0038
|
||||
# DepthFmt_z24_Cy_FZn_M200037
|
||||
# DepthFmt_z24_Cy_FZn_M240036
|
||||
# DepthFmt_z24_Cy_FZn_M280035
|
||||
# DepthFmt_z24_Cy_FZn_M2c0034
|
||||
# DepthFmt_z24_Cy_FZn_M300033
|
||||
# DepthFmt_z24_Cy_FZn_M340032
|
||||
# DepthFmt_z24_Cy_FZn_M380031
|
||||
# DepthFmt_z24_Cy_FZn_M3c0030
|
||||
# DepthFmt_z24_Cy_FZn_M40002f
|
||||
# DepthFmt_z24_Cy_FZn_M44002e
|
||||
# DepthFmt_z24_Cy_FZn_M48002d
|
||||
# DepthFmt_z24_Cy_FZn_M4c002c
|
||||
# DepthFmt_z24_Cy_FZn_M50002b
|
||||
# DepthFmt_z24_Cy_FZn_M54002a
|
||||
# DepthFmt_z24_Cy_FZn_M580029
|
||||
# DepthFmt_z24_Cy_FZn_M5c0028
|
||||
# DepthFmt_z24_Cy_FZn_M600027
|
||||
# DepthFmt_z24_Cy_FZn_M640026
|
||||
# DepthFmt_z24_Cy_FZn_M680025
|
||||
# DepthFmt_z24_Cy_FZn_M6c0024
|
||||
# DepthFmt_z24_Cy_FZn_M700023
|
||||
# DepthFmt_z24_Cy_FZn_M740022
|
||||
# DepthFmt_z24_Cy_FZn_M780021
|
||||
# DepthFmt_z24_Cy_FZn_M7c0020
|
||||
# DepthFmt_z24_Cy_FZn_M80001f
|
||||
# DepthFmt_z24_Cy_FZn_M84001e
|
||||
# DepthFmt_z24_Cy_FZn_M88001d
|
||||
# DepthFmt_z24_Cy_FZn_M8c001c
|
||||
# DepthFmt_z24_Cy_FZn_M90001b
|
||||
# DepthFmt_z24_Cy_FZn_M94001a
|
||||
# DepthFmt_z24_Cy_FZn_M980019
|
||||
# DepthFmt_z24_Cy_FZn_M9c0018
|
||||
# DepthFmt_z24_Cy_FZn_Ma00017
|
||||
# DepthFmt_z24_Cy_FZn_Ma40016
|
||||
# DepthFmt_z24_Cy_FZn_Ma80015
|
||||
# DepthFmt_z24_Cy_FZn_Mac0014
|
||||
# DepthFmt_z24_Cy_FZn_Mb00013
|
||||
# DepthFmt_z24_Cy_FZn_Mb40012
|
||||
# DepthFmt_z24_Cy_FZn_Mb80011
|
||||
# DepthFmt_z24_Cy_FZn_Mbc0010
|
||||
# DepthFmt_z24_Cy_FZn_Mc0000f
|
||||
# DepthFmt_z24_Cy_FZn_Mc4000e
|
||||
# DepthFmt_z24_Cy_FZn_Mc8000d
|
||||
# DepthFmt_z24_Cy_FZn_Mcc000c
|
||||
# DepthFmt_z24_Cy_FZn_Md0000b
|
||||
# DepthFmt_z24_Cy_FZn_Md4000a
|
||||
# DepthFmt_z24_Cy_FZn_Md80009
|
||||
# DepthFmt_z24_Cy_FZn_Mdc0008
|
||||
# DepthFmt_z24_Cy_FZn_Me00007
|
||||
# DepthFmt_z24_Cy_FZn_Me40006
|
||||
# DepthFmt_z24_Cy_FZn_Me80005
|
||||
# DepthFmt_z24_Cy_FZn_Mec0004
|
||||
# DepthFmt_z24_Cy_FZn_Mf00003
|
||||
# DepthFmt_z24_Cy_FZn_Mf40002
|
||||
# DepthFmt_z24_Cy_FZn_Mf80001
|
||||
# DepthFmt_z24_Cy_FZn_Mfc0000
|
||||
# DepthFmt_z24_Cy_FZn_Mffffff
|
||||
|
||||
#Image blit
|
||||
# ImgBlt_BLENDAND_XRGB_B00000000
|
||||
# ImgBlt_BLENDAND_XRGB_B007FFFFF
|
||||
# ImgBlt_BLENDAND_XRGB_B00800000
|
||||
# ImgBlt_BLENDAND_XRGB_B00D00000
|
||||
# ImgBlt_BLENDAND_XRGB_B03300000
|
||||
# ImgBlt_BLENDAND_XRGB_B44400000
|
||||
# ImgBlt_BLENDAND_XRGB_B444FFFFF
|
||||
# ImgBlt_BLENDAND_XRGB_B66800000
|
||||
# ImgBlt_BLENDAND_XRGB_B7F800000
|
||||
# ImgBlt_BLENDAND_XRGB_B7FFFFFFF
|
||||
# ImgBlt_BLENDAND_XRGB_B80000000
|
||||
# ImgBlt_BLENDAND_XRGB_B8FFFFFFF
|
||||
# ImgBlt_BLENDAND_ZRGB_B007FFFFF
|
||||
# ImgBlt_BLENDAND_ZRGB_B00800000
|
||||
# ImgBlt_BLENDAND_ZRGB_B00D00000
|
||||
# ImgBlt_BLENDAND_ZRGB_B03300000
|
||||
# ImgBlt_BLENDAND_ZRGB_B44400000
|
||||
# ImgBlt_BLENDAND_ZRGB_B444FFFFF
|
||||
# ImgBlt_BLENDAND_ZRGB_B66800000
|
||||
# ImgBlt_BLENDAND_ZRGB_B7F800000
|
||||
# ImgBlt_SRCCOPY_ARGB_B00000000
|
||||
# ImgBlt_SRCCOPY_XRGB_B00000000
|
||||
# ImgBlt_SRCCOPY_ZRGB_B00000000
|
||||
|
||||
#Material alpha
|
||||
# MatA_SMat_A0
|
||||
# MatA_SMat_A3D4CCCCD
|
||||
# MatA_SMat_A3E800000
|
||||
# MatA_SMat_A3F000000
|
||||
# MatA_SMat_A3F400000
|
||||
# MatA_SMat_A3F800000
|
||||
# MatA_SMat_A40000000
|
||||
# MatA_SMat_ABF800000
|
||||
# MatA_SVDiffuse_A0
|
||||
# MatA_SVDiffuse_A3D4CCCCD
|
||||
# MatA_SVDiffuse_A3E800000
|
||||
# MatA_SVDiffuse_A3F000000
|
||||
# MatA_SVDiffuse_A3F400000
|
||||
# MatA_SVDiffuse_A3F800000
|
||||
# MatA_SVDiffuse_A40000000
|
||||
# MatA_SVDiffuse_ABF800000
|
||||
# MatA_SVSpec_A0
|
||||
# MatA_SVSpec_A3D4CCCCD
|
||||
# MatA_SVSpec_A3E800000
|
||||
# MatA_SVSpec_A3F000000
|
||||
# MatA_SVSpec_A3F400000
|
||||
# MatA_SVSpec_A3F800000
|
||||
# MatA_SVSpec_A40000000
|
||||
# MatA_SVSpec_ABF800000
|
||||
|
||||
#Material color
|
||||
# 001_RG0_11
|
||||
# 011_rBg_11
|
||||
# 011_rG0_B1
|
||||
# 301_rG0_11
|
||||
# 310_rG0_11
|
||||
# 311_rG0_11
|
||||
|
||||
#Material color source
|
||||
# FromMaterial
|
||||
# FromVertexDiffuse
|
||||
# FromVertexSpecular
|
||||
|
||||
#Overlapping draw modes
|
||||
# ArrElm_DrwArr_ArrElm
|
||||
# DrwArr_DrwArr
|
||||
|
||||
#SetVertexData
|
||||
# SET_VERTEX_DATA2F_M
|
||||
# SET_VERTEX_DATA2S-0001
|
||||
# SET_VERTEX_DATA2S-7FFF
|
||||
# SET_VERTEX_DATA4F_M
|
||||
# SET_VERTEX_DATA4S_M-0001
|
||||
# SET_VERTEX_DATA4S_M-7FFF
|
||||
# SET_VERTEX_DATA4UB
|
||||
|
||||
#Texture border
|
||||
# 2D
|
||||
|
||||
#Texgen with texture matrix
|
||||
# Disabled_Arbitrary
|
||||
# Disabled_Double
|
||||
# Disabled_Half
|
||||
# Disabled_Identity
|
||||
# Disabled_RotateX
|
||||
# Disabled_RotateY
|
||||
# Disabled_RotateZ
|
||||
# Disabled_ShiftHMinus
|
||||
# Disabled_ShiftHPlus
|
||||
# Disabled_ShiftVMinus
|
||||
# Disabled_ShiftVPlus
|
||||
# EyeLinear_Arbitrary
|
||||
# EyeLinear_Double
|
||||
# EyeLinear_Half
|
||||
# EyeLinear_Identity
|
||||
# EyeLinear_RotateX
|
||||
# EyeLinear_RotateY
|
||||
# EyeLinear_RotateZ
|
||||
# EyeLinear_ShiftHMinus
|
||||
# EyeLinear_ShiftHPlus
|
||||
# EyeLinear_ShiftVMinus
|
||||
# EyeLinear_ShiftVPlus
|
||||
# NormalMap_Arbitrary
|
||||
# NormalMap_Double
|
||||
# NormalMap_Half
|
||||
# NormalMap_Identity
|
||||
# NormalMap_RotateX
|
||||
# NormalMap_RotateY
|
||||
# NormalMap_RotateZ
|
||||
# NormalMap_ShiftHMinus
|
||||
# NormalMap_ShiftHPlus
|
||||
# NormalMap_ShiftVMinus
|
||||
# NormalMap_ShiftVPlus
|
||||
# ReflectionMap_Arbitrary
|
||||
# ReflectionMap_Double
|
||||
# ReflectionMap_Half
|
||||
# ReflectionMap_Identity
|
||||
# ReflectionMap_RotateX
|
||||
# ReflectionMap_RotateY
|
||||
# ReflectionMap_RotateZ
|
||||
# ReflectionMap_ShiftHMinus
|
||||
# ReflectionMap_ShiftHPlus
|
||||
# ReflectionMap_ShiftVMinus
|
||||
# ReflectionMap_ShiftVPlus
|
||||
|
||||
#Texgen
|
||||
# Disabled
|
||||
# EyeLinear
|
||||
# NormalMap
|
||||
# ReflectionMap
|
||||
|
||||
#Texture format
|
||||
# TexFmt_A1R5G5B5
|
||||
# TexFmt_A1R5G5B5_L
|
||||
# TexFmt_A4R4G4B4
|
||||
# TexFmt_A4R4G4B4_L
|
||||
# TexFmt_A8B8G8R8
|
||||
# TexFmt_A8B8G8R8_L
|
||||
# TexFmt_A8R8G8B8
|
||||
# TexFmt_A8R8G8B8_L
|
||||
# TexFmt_A8Y8
|
||||
# TexFmt_AY8
|
||||
# TexFmt_AY8_L
|
||||
# TexFmt_B8G8R8A8
|
||||
# TexFmt_B8G8R8A8_L
|
||||
# TexFmt_DXT1
|
||||
# TexFmt_G8B8
|
||||
# TexFmt_G8B8_L
|
||||
# TexFmt_R5G6B5
|
||||
# TexFmt_R5G6B5_L
|
||||
# TexFmt_R8B8
|
||||
# TexFmt_R8G8B8A8
|
||||
# TexFmt_R8G8B8A8_L
|
||||
# TexFmt_SZ_Index8_p128
|
||||
# TexFmt_SZ_Index8_p256
|
||||
# TexFmt_SZ_Index8_p32
|
||||
# TexFmt_SZ_Index8_p64
|
||||
# TexFmt_UYVY_L
|
||||
# TexFmt_X1R5G5B5
|
||||
# TexFmt_X1R5G5B5_L
|
||||
# TexFmt_X8R8G8B8
|
||||
# TexFmt_X8R8G8B8_L
|
||||
# TexFmt_Y8
|
||||
# TexFmt_Y8_L
|
||||
# TexFmt_YUY2_L
|
||||
|
||||
#Texture Matrix
|
||||
# Arbitrary
|
||||
# Double
|
||||
# Half
|
||||
# Identity
|
||||
# RotateX
|
||||
# RotateY
|
||||
# RotateZ
|
||||
# ShiftHMinus
|
||||
# ShiftHPlus
|
||||
# ShiftVMinus
|
||||
# ShiftVPlus
|
||||
|
||||
#Texture render target
|
||||
# TexFmt_A1R5G5B5
|
||||
# TexFmt_A1R5G5B5_L
|
||||
# TexFmt_A4R4G4B4
|
||||
# TexFmt_A4R4G4B4_L
|
||||
# TexFmt_A8B8G8R8
|
||||
# TexFmt_A8B8G8R8_L
|
||||
# TexFmt_A8R8G8B8
|
||||
# TexFmt_A8R8G8B8_L
|
||||
# TexFmt_A8Y8
|
||||
# TexFmt_AY8
|
||||
# TexFmt_AY8_L
|
||||
# TexFmt_B8G8R8A8
|
||||
# TexFmt_B8G8R8A8_L
|
||||
# TexFmt_DXT1
|
||||
# TexFmt_G8B8
|
||||
# TexFmt_G8B8_L
|
||||
# TexFmt_R5G6B5
|
||||
# TexFmt_R5G6B5_L
|
||||
# TexFmt_R8B8
|
||||
# TexFmt_R8G8B8A8
|
||||
# TexFmt_R8G8B8A8_L
|
||||
# TexFmt_SZ_Index8_p128
|
||||
# TexFmt_SZ_Index8_p256
|
||||
# TexFmt_SZ_Index8_p32
|
||||
# TexFmt_SZ_Index8_p64
|
||||
# TexFmt_UYVY_L
|
||||
# TexFmt_X1R5G5B5
|
||||
# TexFmt_X1R5G5B5_L
|
||||
# TexFmt_X8R8G8B8
|
||||
# TexFmt_X8R8G8B8_L
|
||||
# TexFmt_Y8
|
||||
# TexFmt_Y8_L
|
||||
# TexFmt_YUY2_L
|
||||
|
||||
#3D primitive
|
||||
# LineLoop
|
||||
# LineLoop-inlinearrays
|
||||
# LineLoop-inlinebuf
|
||||
# LineLoop-inlineelements
|
||||
# LineStrip
|
||||
# LineStrip-inlinearrays
|
||||
# LineStrip-inlinebuf
|
||||
# LineStrip-inlineelements
|
||||
# Lines
|
||||
# Lines-inlinearrays
|
||||
# Lines-inlinebuf
|
||||
# Lines-inlineelements
|
||||
# Points
|
||||
# Points-inlinearrays
|
||||
# Points-inlinebuf
|
||||
# Points-inlineelements
|
||||
# Polygon
|
||||
# Polygon-inlinearrays
|
||||
# Polygon-inlinebuf
|
||||
# Polygon-inlineelements
|
||||
# QuadStrip
|
||||
# QuadStrip-inlinearrays
|
||||
# QuadStrip-inlinebuf
|
||||
# QuadStrip-inlineelements
|
||||
# Quads
|
||||
# Quads-inlinearrays
|
||||
# Quads-inlinebuf
|
||||
# Quads-inlineelements
|
||||
# TriFan
|
||||
# TriFan-inlinearrays
|
||||
# TriFan-inlinebuf
|
||||
# TriFan-inlineelements
|
||||
# TriStrip
|
||||
# TriStrip-inlinearrays
|
||||
# TriStrip-inlinebuf
|
||||
# TriStrip-inlineelements
|
||||
# Triangles
|
||||
# Triangles-inlinearrays
|
||||
# Triangles-inlinebuf
|
||||
# Triangles-inlineelements
|
||||
|
||||
#2D Lines
|
||||
# 2DLine-R5G5B5-C000003E0-400_200-400_400
|
||||
# 2DLine-R5G6B5-C000007E0-400_200-400_400
|
||||
# 2DLine-R8G8B8-C00000000-400_200-400_400
|
||||
# 2DLine-R8G8B8-C0000FF00-400_200-400_400
|
||||
# 2DLine-R8G8B8-C0000FF00-444_222-444_444
|
||||
# 2DLine-R8G8B8-C00FF0000-400_200-400_400
|
||||
# 2DLine-R8G8B8-C00FFFFFF-0_0-639_479
|
||||
# 2DLine-R8G8B8-C00FFFFFF-222_222-222_222
|
||||
# 2DLine-R8G8B8-C00FFFFFF-400_0-400_479
|
||||
# 2DLine-R8G8B8-C00FFFFFF-400_300-400_301
|
||||
# 2DLine-R8G8B8-C00FFFFFF-400_300-401_300
|
||||
# 2DLine-R8G8B8-C00FFFFFF-639_479-0_0
|
||||
# 2DLine-R8G8B8-CFFFFFFFF-100_100-100_400
|
||||
|
||||
#Vertex shader rounding tests
|
||||
# Geometry_0.000000
|
||||
# Geometry_0.001000
|
||||
# Geometry_0.500000
|
||||
# Geometry_0.562400
|
||||
# Geometry_0.562500
|
||||
# Geometry_0.562600
|
||||
# Geometry_0.999000
|
||||
# RenderTarget
|
||||
|
||||
#Volume texture
|
||||
# A1R5G5B5
|
||||
# A4R4G4B4
|
||||
# A8B8G8R8
|
||||
# A8R8G8B8
|
||||
# A8Y8
|
||||
# AY8
|
||||
# B8G8R8A8
|
||||
# DXT1
|
||||
# G8B8
|
||||
# R5G6B5
|
||||
# R8B8
|
||||
# R8G8B8A8
|
||||
# SZ_Index8
|
||||
# X1R5G5B5
|
||||
# X8R8G8B8
|
||||
# Y8
|
||||
|
||||
#W param
|
||||
# w_gaps
|
||||
# w_neg_strip
|
||||
# w_pos_strip
|
||||
|
||||
Zero stride
|
||||
# DrawArrays
|
||||
# InlineElements
|
||||
2012
test-pgraph/config.json
Normal file
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 12 KiB |
@@ -19,8 +19,12 @@ def main():
|
||||
ap.add_argument('--ffmpeg', help='Path to the ffmpeg binary or DISABLE')
|
||||
ap.add_argument('--no-fullscreen', action='store_true', help='Force xemu to run in a window')
|
||||
ap.add_argument('--perceptualdiff', help='Path to the perceptualdiff binary or DISABLE')
|
||||
ap.add_argument('-v', '--verbose', action='store_true', help='Print verbose logging information')
|
||||
args = ap.parse_args()
|
||||
|
||||
if args.verbose:
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
tests = []
|
||||
result = True
|
||||
|
||||
@@ -52,7 +56,7 @@ def main():
|
||||
|
||||
test_env = xemutest.TestEnvironment(
|
||||
os.path.abspath(os.path.expanduser(args.private)),
|
||||
args.xemu,
|
||||
xemu_path,
|
||||
args.ffmpeg,
|
||||
args.perceptualdiff,
|
||||
args.no_fullscreen)
|
||||
|
||||
@@ -58,7 +58,7 @@ class TestBase:
|
||||
"""
|
||||
Provides a basic framework that:
|
||||
- Starts FFMPEG to record footage of xemu while it runs
|
||||
- Launches xemu with an test XBE loaded from a disc image
|
||||
- Launches xemu with a test XBE loaded from a disc image
|
||||
- Waits for xemu to shutdown or timeout
|
||||
- Inspect the filesystem for test results
|
||||
|
||||
@@ -85,6 +85,7 @@ class TestBase:
|
||||
self.timeout = timeout
|
||||
self.test_env = test_env
|
||||
self.ffmpeg = None
|
||||
self.xemu_exit_status = None
|
||||
|
||||
assert os.path.isfile(self.flash_path)
|
||||
assert os.path.isfile(self.mcpx_path)
|
||||
@@ -171,7 +172,7 @@ class TestBase:
|
||||
c = [self.test_env.xemu_path, '-config_path', './xemu.toml', '-dvd_path', self.iso_path]
|
||||
else:
|
||||
c = [self.test_env.xemu_path, '-config_path', './xemu.toml', '-dvd_path', self.iso_path]
|
||||
if not self.test_env.disable_fullscreen:
|
||||
if not self.test_env.disable_fullscreen:
|
||||
c.append('-full-screen')
|
||||
log.info('Launching xemu with command %s from directory %s', repr(c), os.getcwd())
|
||||
start = time.time()
|
||||
@@ -213,10 +214,11 @@ class TestBase:
|
||||
status = xemu.poll()
|
||||
if status is not None:
|
||||
log.info('xemu exited %d', status)
|
||||
self.xemu_exit_status = status
|
||||
break
|
||||
now = time.time()
|
||||
if (now - start) > self.timeout:
|
||||
log.info('Timeout exceeded. Terminating.')
|
||||
log.warning('Timeout exceeded. Terminating.')
|
||||
xemu.kill()
|
||||
xemu.wait()
|
||||
break
|
||||
@@ -253,9 +255,10 @@ class TestBase:
|
||||
else:
|
||||
perceptualdiff_path = 'perceptualdiff'
|
||||
|
||||
c = [perceptualdiff_path, expected_path, actual_path, '--verbose']
|
||||
c = [perceptualdiff_path, '--verbose']
|
||||
if diff_result_path:
|
||||
c.extend(['--output', diff_result_path])
|
||||
c.extend([expected_path, actual_path])
|
||||
result = subprocess.run(c, capture_output=True)
|
||||
return result.returncode == 0, result.stderr.decode('utf-8')
|
||||
|
||||
|
||||
@@ -2,68 +2,87 @@
|
||||
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from pyfatx import Fatx
|
||||
import test_base
|
||||
|
||||
log = logging.getLogger(__file__)
|
||||
|
||||
TIMEOUT_SECONDS = 10 * 60
|
||||
|
||||
|
||||
class TestNXDKPgraphTests(test_base.TestBase):
|
||||
"""Runs the nxdk_pgraph_tests suite and validates output."""
|
||||
|
||||
def __init__(self, test_env: test_base.TestEnvironment, results_path: str, test_data_path: str):
|
||||
self.config_file_path = os.path.join(test_data_path, 'config.cnf')
|
||||
if not self.config_file_path:
|
||||
raise FileNotFoundError(
|
||||
'Test data was not installed with the package. You need to copy '
|
||||
f'config.cnf to {test_data_path}.')
|
||||
|
||||
iso_path = os.path.join(test_data_path, 'nxdk_pgraph_tests.iso')
|
||||
def __init__(self, test_env: test_base.TestEnvironment, results_path: str, test_data_path: str) -> None:
|
||||
iso_path = os.path.join(test_data_path, 'nxdk_pgraph_tests_xiso.iso')
|
||||
if not os.path.isfile(iso_path):
|
||||
raise FileNotFoundError('Test data was not installed with the package. You need to build it and copy '
|
||||
f'to {test_data_path}.')
|
||||
msg = f'{iso_path} was not installed with the package. You need to build or download it.'
|
||||
raise FileNotFoundError(msg)
|
||||
|
||||
self.golden_results_path = os.path.join(test_data_path, "golden_results")
|
||||
self.golden_results_path = os.path.join(test_data_path, "nxdk_pgraph_tests_golden_results")
|
||||
if not os.path.isdir(self.golden_results_path):
|
||||
msg = f'{self.golden_results_path} was not installed with the package. Please check it out from Github.'
|
||||
raise FileNotFoundError(msg)
|
||||
|
||||
timeout_seconds = 5 * 60
|
||||
super().__init__(test_env, 'nxdk_pgraph_tests', results_path, iso_path, timeout_seconds)
|
||||
|
||||
def setup_hdd_files(self, fs: Fatx):
|
||||
with open(self.config_file_path, 'r') as config_file:
|
||||
config_data = config_file.read()
|
||||
fs.write('/pgraph_tests.cnf', config_data.encode('ascii'))
|
||||
super().__init__(test_env, 'nxdk_pgraph_tests', results_path, iso_path, TIMEOUT_SECONDS)
|
||||
|
||||
def analyze_results(self):
|
||||
"""Processes the generated image files, diffing against the golden result set."""
|
||||
if self.xemu_exit_status is None:
|
||||
log.warning("xemu exited due to timeout, results are likely partial")
|
||||
elif self.xemu_exit_status:
|
||||
log.warning("xemu terminated due to error (%d), results may be partial due to a crash",
|
||||
self.xemu_exit_status)
|
||||
|
||||
diff_dir = '_diffs'
|
||||
diff_results_dir = os.path.join(self.results_out_path, diff_dir)
|
||||
os.makedirs(diff_results_dir, exist_ok=True)
|
||||
diff_results_dir = self._prepare_diff_dir(diff_dir)
|
||||
|
||||
failed_comparisons = {}
|
||||
|
||||
for root, dirnames, files in os.walk(self.results_out_path):
|
||||
root = os.path.relpath(root, self.results_out_path)
|
||||
root_relative_to_out_path = os.path.relpath(root, self.results_out_path)
|
||||
if diff_dir in dirnames:
|
||||
dirnames.remove(diff_dir)
|
||||
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
expected_path = os.path.abspath(os.path.join(self.golden_results_path, file_path))
|
||||
actual_path = os.path.abspath(file_path)
|
||||
diff_path = os.path.join(diff_results_dir, file_path)
|
||||
|
||||
if not os.path.isfile(expected_path):
|
||||
log.warning(f"Missing golden image {expected_path}")
|
||||
continue
|
||||
|
||||
match, message = self.compare_images(expected_path, actual_path, diff_path)
|
||||
if not match:
|
||||
failed_comparisons[file_path] = message
|
||||
failed_comparisons.update(self._compare_results(root_relative_to_out_path, diff_results_dir, files))
|
||||
|
||||
if failed_comparisons:
|
||||
raise Exception(f"Failed comparisons: {failed_comparisons}")
|
||||
msg = f"Failed {len(failed_comparisons)} comparisons: {failed_comparisons}"
|
||||
raise Exception(msg)
|
||||
|
||||
def teardown_hdd_files(self, fs: Fatx):
|
||||
try:
|
||||
fs.unlink('/pgraph_tests.cnf')
|
||||
except AssertionError:
|
||||
pass
|
||||
def _compare_results(
|
||||
self,
|
||||
root_relative_to_out_path: str,
|
||||
diff_results_dir: str,
|
||||
files: list[str]
|
||||
) -> dict[str, str]:
|
||||
failed_comparisons: dict[str, str] = {}
|
||||
|
||||
for file in files:
|
||||
if not file.endswith(".png"):
|
||||
continue
|
||||
|
||||
relative_file_path = os.path.join(root_relative_to_out_path, file)
|
||||
expected_path = os.path.abspath(os.path.join(self.golden_results_path, relative_file_path))
|
||||
actual_path = os.path.abspath(os.path.join(self.results_out_path, relative_file_path))
|
||||
diff_path = os.path.join(diff_results_dir, relative_file_path)
|
||||
os.makedirs(os.path.dirname(diff_path), exist_ok=True)
|
||||
|
||||
if not os.path.isfile(expected_path):
|
||||
log.warning("Missing golden image %s for output %s", expected_path, actual_path)
|
||||
continue
|
||||
|
||||
match, message = self.compare_images(expected_path, actual_path, diff_path)
|
||||
if not match:
|
||||
log.warning("Generated image %s does not match golden", actual_path)
|
||||
failed_comparisons[relative_file_path] = message
|
||||
|
||||
return failed_comparisons
|
||||
|
||||
def _prepare_diff_dir(self, diff_dir: str) -> str:
|
||||
diff_results_dir = os.path.abspath(os.path.join(self.results_out_path, diff_dir))
|
||||
if os.path.exists(diff_results_dir):
|
||||
shutil.rmtree(diff_results_dir)
|
||||
os.makedirs(diff_results_dir, exist_ok=True)
|
||||
return diff_results_dir
|
||||
|
||||