Update to latest nxdk_pgraph_tests.

This commit is contained in:
Erik Abair
2025-01-20 10:58:31 -08:00
committed by mborgerson
parent d8e5a73337
commit fe4cfcc504
42 changed files with 2181 additions and 997 deletions

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "nxdk_pgraph_tests"]
path = test-pgraph/nxdk_pgraph_tests
url = https://github.com/abaire/nxdk_pgraph_tests.git

View File

@@ -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"]

View File

@@ -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:

View File

@@ -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

View File

@@ -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'

View File

@@ -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.

View File

@@ -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

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -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)

View File

@@ -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')

View File

@@ -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