Merge pull request #818 from linkmauve/no-trailing-whitespace
Ban trailing whitespace from the entire project, forever
This commit is contained in:
commit
a489a84656
|
@ -3,10 +3,16 @@
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
|
if grep -r '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
|
||||||
|
dist/*.svg dist/*.xml; then
|
||||||
|
echo Trailing whitespace found, aborting
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
#if OS is linux or is not set
|
#if OS is linux or is not set
|
||||||
if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
|
if [ "$TRAVIS_OS_NAME" = "linux" -o -z "$TRAVIS_OS_NAME" ]; then
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake -DUSE_QT5=OFF ..
|
cmake -DUSE_QT5=OFF ..
|
||||||
make -j4
|
make -j4
|
||||||
elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
export Qt5_DIR=$(brew --prefix)/opt/qt5
|
export Qt5_DIR=$(brew --prefix)/opt/qt5
|
||||||
|
|
|
@ -6,7 +6,7 @@ if [ "$TRAVIS_BRANCH" = "master" ]; then
|
||||||
REV_NAME="citra-${GITDATE}-${GITREV}-linux-amd64"
|
REV_NAME="citra-${GITDATE}-${GITREV}-linux-amd64"
|
||||||
UPLOAD_DIR="/citra/nightly/linux-amd64"
|
UPLOAD_DIR="/citra/nightly/linux-amd64"
|
||||||
mkdir "$REV_NAME"
|
mkdir "$REV_NAME"
|
||||||
|
|
||||||
sudo apt-get -qq install lftp
|
sudo apt-get -qq install lftp
|
||||||
cp build/src/citra/citra "$REV_NAME"
|
cp build/src/citra/citra "$REV_NAME"
|
||||||
cp build/src/citra_qt/citra-qt "$REV_NAME"
|
cp build/src/citra_qt/citra-qt "$REV_NAME"
|
||||||
|
@ -14,7 +14,7 @@ if [ "$TRAVIS_BRANCH" = "master" ]; then
|
||||||
REV_NAME="citra-${GITDATE}-${GITREV}-osx-amd64"
|
REV_NAME="citra-${GITDATE}-${GITREV}-osx-amd64"
|
||||||
UPLOAD_DIR="/citra/nightly/osx-amd64"
|
UPLOAD_DIR="/citra/nightly/osx-amd64"
|
||||||
mkdir "$REV_NAME"
|
mkdir "$REV_NAME"
|
||||||
|
|
||||||
brew install lftp
|
brew install lftp
|
||||||
cp build/src/citra/Release/citra "$REV_NAME"
|
cp build/src/citra/Release/citra "$REV_NAME"
|
||||||
cp -r build/src/citra_qt/Release/citra-qt.app "$REV_NAME"
|
cp -r build/src/citra_qt/Release/citra-qt.app "$REV_NAME"
|
||||||
|
@ -22,7 +22,7 @@ if [ "$TRAVIS_BRANCH" = "master" ]; then
|
||||||
# move qt libs into app bundle for deployment
|
# move qt libs into app bundle for deployment
|
||||||
$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
|
$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ARCHIVE_NAME="${REV_NAME}.tar.xz"
|
ARCHIVE_NAME="${REV_NAME}.tar.xz"
|
||||||
tar -cJvf "$ARCHIVE_NAME" "$REV_NAME"
|
tar -cJvf "$ARCHIVE_NAME" "$REV_NAME"
|
||||||
lftp -c "open -u citra-builds,$BUILD_PASSWORD sftp://builds.citra-emu.org; put -O '$UPLOAD_DIR' '$ARCHIVE_NAME'"
|
lftp -c "open -u citra-builds,$BUILD_PASSWORD sftp://builds.citra-emu.org; put -O '$UPLOAD_DIR' '$ARCHIVE_NAME'"
|
||||||
|
|
|
@ -6,7 +6,7 @@ language: cpp
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- secure: "AXHFIafTmbGDsHD3mUVj5a4I397DQjti/WoqAJGUp2PglxTcc04BwxZ9Z+xLuf5N2Hs5r9ojAJLT8OGxJCLBDXzneQTNSqXbFuYSLbqrEAiIRlA9eRIotWCg+wYcO+5e8MKX+cHVKwiIWasUB21AtCdq6msh6Y3pUshZp212VPg="
|
- secure: "AXHFIafTmbGDsHD3mUVj5a4I397DQjti/WoqAJGUp2PglxTcc04BwxZ9Z+xLuf5N2Hs5r9ojAJLT8OGxJCLBDXzneQTNSqXbFuYSLbqrEAiIRlA9eRIotWCg+wYcO+5e8MKX+cHVKwiIWasUB21AtCdq6msh6Y3pUshZp212VPg="
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- sh .travis-deps.sh
|
- sh .travis-deps.sh
|
||||||
|
|
|
@ -38,7 +38,7 @@ else()
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${optimization_flags} /MP /MD" CACHE STRING "" FORCE)
|
set(CMAKE_CXX_FLAGS_RELEASE "${optimization_flags} /MP /MD" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE)
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE)
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE)
|
||||||
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG" CACHE STRING "" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
@ -130,7 +130,7 @@ IF (APPLE)
|
||||||
FIND_LIBRARY(IOKIT_LIBRARY IOKit) # GLFW dependency
|
FIND_LIBRARY(IOKIT_LIBRARY IOKit) # GLFW dependency
|
||||||
FIND_LIBRARY(COREVIDEO_LIBRARY CoreVideo) # GLFW dependency
|
FIND_LIBRARY(COREVIDEO_LIBRARY CoreVideo) # GLFW dependency
|
||||||
set(PLATFORM_LIBRARIES iconv ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
set(PLATFORM_LIBRARIES iconv ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
|
||||||
ELSEIF(MINGW)
|
ELSEIF(MINGW)
|
||||||
|
|
124
Doxyfile
124
Doxyfile
|
@ -38,7 +38,7 @@ PROJECT_NAME = Citra
|
||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER =
|
PROJECT_NUMBER =
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
|
@ -162,7 +162,7 @@ FULL_PATH_NAMES = YES
|
||||||
# will be relative from the directory where doxygen is started.
|
# will be relative from the directory where doxygen is started.
|
||||||
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
|
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
|
||||||
|
|
||||||
STRIP_FROM_PATH =
|
STRIP_FROM_PATH =
|
||||||
|
|
||||||
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
|
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
|
||||||
# path mentioned in the documentation of a class, which tells the reader which
|
# path mentioned in the documentation of a class, which tells the reader which
|
||||||
|
@ -171,7 +171,7 @@ STRIP_FROM_PATH =
|
||||||
# specify the list of include paths that are normally passed to the compiler
|
# specify the list of include paths that are normally passed to the compiler
|
||||||
# using the -I flag.
|
# using the -I flag.
|
||||||
|
|
||||||
STRIP_FROM_INC_PATH =
|
STRIP_FROM_INC_PATH =
|
||||||
|
|
||||||
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
|
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
|
||||||
# less readable) file names. This can be useful is your file systems doesn't
|
# less readable) file names. This can be useful is your file systems doesn't
|
||||||
|
@ -238,13 +238,13 @@ TAB_SIZE = 4
|
||||||
# "Side Effects:". You can put \n's in the value part of an alias to insert
|
# "Side Effects:". You can put \n's in the value part of an alias to insert
|
||||||
# newlines.
|
# newlines.
|
||||||
|
|
||||||
ALIASES =
|
ALIASES =
|
||||||
|
|
||||||
# This tag can be used to specify a number of word-keyword mappings (TCL only).
|
# This tag can be used to specify a number of word-keyword mappings (TCL only).
|
||||||
# A mapping has the form "name=value". For example adding "class=itcl::class"
|
# A mapping has the form "name=value". For example adding "class=itcl::class"
|
||||||
# will allow you to use the command class in the itcl::class meaning.
|
# will allow you to use the command class in the itcl::class meaning.
|
||||||
|
|
||||||
TCL_SUBST =
|
TCL_SUBST =
|
||||||
|
|
||||||
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
|
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
|
||||||
# only. Doxygen will then generate output that is more tailored for C. For
|
# only. Doxygen will then generate output that is more tailored for C. For
|
||||||
|
@ -291,7 +291,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
|
||||||
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
|
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
|
||||||
# the files are not read by doxygen.
|
# the files are not read by doxygen.
|
||||||
|
|
||||||
EXTENSION_MAPPING =
|
EXTENSION_MAPPING =
|
||||||
|
|
||||||
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
|
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
|
||||||
# according to the Markdown format, which allows for more readable
|
# according to the Markdown format, which allows for more readable
|
||||||
|
@ -627,7 +627,7 @@ GENERATE_DEPRECATEDLIST= YES
|
||||||
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
|
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
|
||||||
# ... \endcond blocks.
|
# ... \endcond blocks.
|
||||||
|
|
||||||
ENABLED_SECTIONS =
|
ENABLED_SECTIONS =
|
||||||
|
|
||||||
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
|
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
|
||||||
# initial value of a variable or macro / define can have for it to appear in the
|
# initial value of a variable or macro / define can have for it to appear in the
|
||||||
|
@ -669,7 +669,7 @@ SHOW_NAMESPACES = YES
|
||||||
# by doxygen. Whatever the program writes to standard output is used as the file
|
# by doxygen. Whatever the program writes to standard output is used as the file
|
||||||
# version. For an example see the documentation.
|
# version. For an example see the documentation.
|
||||||
|
|
||||||
FILE_VERSION_FILTER =
|
FILE_VERSION_FILTER =
|
||||||
|
|
||||||
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
|
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
|
||||||
# by doxygen. The layout file controls the global structure of the generated
|
# by doxygen. The layout file controls the global structure of the generated
|
||||||
|
@ -682,7 +682,7 @@ FILE_VERSION_FILTER =
|
||||||
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
|
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
|
||||||
# tag is left empty.
|
# tag is left empty.
|
||||||
|
|
||||||
LAYOUT_FILE =
|
LAYOUT_FILE =
|
||||||
|
|
||||||
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
|
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
|
||||||
# the reference definitions. This must be a list of .bib files. The .bib
|
# the reference definitions. This must be a list of .bib files. The .bib
|
||||||
|
@ -692,7 +692,7 @@ LAYOUT_FILE =
|
||||||
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
|
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
|
||||||
# search path. See also \cite for info how to create references.
|
# search path. See also \cite for info how to create references.
|
||||||
|
|
||||||
CITE_BIB_FILES =
|
CITE_BIB_FILES =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to warning and progress messages
|
# Configuration options related to warning and progress messages
|
||||||
|
@ -751,7 +751,7 @@ WARN_FORMAT = "$file:$line: $text"
|
||||||
# messages should be written. If left blank the output is written to standard
|
# messages should be written. If left blank the output is written to standard
|
||||||
# error (stderr).
|
# error (stderr).
|
||||||
|
|
||||||
WARN_LOGFILE =
|
WARN_LOGFILE =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the input files
|
# Configuration options related to the input files
|
||||||
|
@ -807,7 +807,7 @@ RECURSIVE = YES
|
||||||
# Note that relative paths are relative to the directory from which doxygen is
|
# Note that relative paths are relative to the directory from which doxygen is
|
||||||
# run.
|
# run.
|
||||||
|
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
|
|
||||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
||||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||||
|
@ -823,7 +823,7 @@ EXCLUDE_SYMLINKS = NO
|
||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# Note that the wildcards are matched against the file with absolute path, so to
|
||||||
# exclude all test directories for example use the pattern */test/*
|
# exclude all test directories for example use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS =
|
||||||
|
|
||||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||||
|
@ -834,13 +834,13 @@ EXCLUDE_PATTERNS =
|
||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# Note that the wildcards are matched against the file with absolute path, so to
|
||||||
# exclude all test directories use the pattern */test/*
|
# exclude all test directories use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_SYMBOLS =
|
EXCLUDE_SYMBOLS =
|
||||||
|
|
||||||
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
|
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
|
||||||
# that contain example code fragments that are included (see the \include
|
# that contain example code fragments that are included (see the \include
|
||||||
# command).
|
# command).
|
||||||
|
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH =
|
||||||
|
|
||||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
|
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
|
||||||
|
@ -860,7 +860,7 @@ EXAMPLE_RECURSIVE = NO
|
||||||
# that contain images that are to be included in the documentation (see the
|
# that contain images that are to be included in the documentation (see the
|
||||||
# \image command).
|
# \image command).
|
||||||
|
|
||||||
IMAGE_PATH =
|
IMAGE_PATH =
|
||||||
|
|
||||||
# The INPUT_FILTER tag can be used to specify a program that doxygen should
|
# The INPUT_FILTER tag can be used to specify a program that doxygen should
|
||||||
# invoke to filter for each input file. Doxygen will invoke the filter program
|
# invoke to filter for each input file. Doxygen will invoke the filter program
|
||||||
|
@ -877,7 +877,7 @@ IMAGE_PATH =
|
||||||
# code is scanned, but not when the output code is generated. If lines are added
|
# code is scanned, but not when the output code is generated. If lines are added
|
||||||
# or removed, the anchors will not be placed correctly.
|
# or removed, the anchors will not be placed correctly.
|
||||||
|
|
||||||
INPUT_FILTER =
|
INPUT_FILTER =
|
||||||
|
|
||||||
# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
|
# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
|
||||||
# basis. Doxygen will compare the file name with each pattern and apply the
|
# basis. Doxygen will compare the file name with each pattern and apply the
|
||||||
|
@ -886,7 +886,7 @@ INPUT_FILTER =
|
||||||
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
|
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
|
||||||
# patterns match the file name, INPUT_FILTER is applied.
|
# patterns match the file name, INPUT_FILTER is applied.
|
||||||
|
|
||||||
FILTER_PATTERNS =
|
FILTER_PATTERNS =
|
||||||
|
|
||||||
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
|
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
|
||||||
# INPUT_FILTER ) will also be used to filter the input files that are used for
|
# INPUT_FILTER ) will also be used to filter the input files that are used for
|
||||||
|
@ -901,14 +901,14 @@ FILTER_SOURCE_FILES = NO
|
||||||
# *.ext= (so without naming a filter).
|
# *.ext= (so without naming a filter).
|
||||||
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
|
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
|
||||||
|
|
||||||
FILTER_SOURCE_PATTERNS =
|
FILTER_SOURCE_PATTERNS =
|
||||||
|
|
||||||
# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
|
# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
|
||||||
# is part of the input, its contents will be placed on the main page
|
# is part of the input, its contents will be placed on the main page
|
||||||
# (index.html). This can be useful if you have a project on for instance GitHub
|
# (index.html). This can be useful if you have a project on for instance GitHub
|
||||||
# and want to reuse the introduction page also for the doxygen output.
|
# and want to reuse the introduction page also for the doxygen output.
|
||||||
|
|
||||||
USE_MDFILE_AS_MAINPAGE =
|
USE_MDFILE_AS_MAINPAGE =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to source browsing
|
# Configuration options related to source browsing
|
||||||
|
@ -1013,7 +1013,7 @@ CLANG_ASSISTED_PARSING = NO
|
||||||
# specified with INPUT and INCLUDE_PATH.
|
# specified with INPUT and INCLUDE_PATH.
|
||||||
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
|
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
|
||||||
|
|
||||||
CLANG_OPTIONS =
|
CLANG_OPTIONS =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the alphabetical class index
|
# Configuration options related to the alphabetical class index
|
||||||
|
@ -1039,7 +1039,7 @@ COLS_IN_ALPHA_INDEX = 5
|
||||||
# while generating the index headers.
|
# while generating the index headers.
|
||||||
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
|
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
|
||||||
|
|
||||||
IGNORE_PREFIX =
|
IGNORE_PREFIX =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the HTML output
|
# Configuration options related to the HTML output
|
||||||
|
@ -1083,7 +1083,7 @@ HTML_FILE_EXTENSION = .html
|
||||||
# of the possible markers and block names see the documentation.
|
# of the possible markers and block names see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_HEADER =
|
HTML_HEADER =
|
||||||
|
|
||||||
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
|
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
|
||||||
# generated HTML page. If the tag is left blank doxygen will generate a standard
|
# generated HTML page. If the tag is left blank doxygen will generate a standard
|
||||||
|
@ -1093,7 +1093,7 @@ HTML_HEADER =
|
||||||
# that doxygen normally uses.
|
# that doxygen normally uses.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_FOOTER =
|
HTML_FOOTER =
|
||||||
|
|
||||||
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
|
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
|
||||||
# sheet that is used by each HTML page. It can be used to fine-tune the look of
|
# sheet that is used by each HTML page. It can be used to fine-tune the look of
|
||||||
|
@ -1105,7 +1105,7 @@ HTML_FOOTER =
|
||||||
# obsolete.
|
# obsolete.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_STYLESHEET =
|
HTML_STYLESHEET =
|
||||||
|
|
||||||
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
|
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
|
||||||
# cascading style sheets that are included after the standard style sheets
|
# cascading style sheets that are included after the standard style sheets
|
||||||
|
@ -1118,7 +1118,7 @@ HTML_STYLESHEET =
|
||||||
# list). For an example see the documentation.
|
# list). For an example see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_EXTRA_STYLESHEET =
|
HTML_EXTRA_STYLESHEET =
|
||||||
|
|
||||||
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
|
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
|
||||||
# other source files which should be copied to the HTML output directory. Note
|
# other source files which should be copied to the HTML output directory. Note
|
||||||
|
@ -1128,7 +1128,7 @@ HTML_EXTRA_STYLESHEET =
|
||||||
# files will be copied as-is; there are no commands or markers available.
|
# files will be copied as-is; there are no commands or markers available.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_EXTRA_FILES =
|
HTML_EXTRA_FILES =
|
||||||
|
|
||||||
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
||||||
# will adjust the colors in the stylesheet and background images according to
|
# will adjust the colors in the stylesheet and background images according to
|
||||||
|
@ -1256,7 +1256,7 @@ GENERATE_HTMLHELP = NO
|
||||||
# written to the html output directory.
|
# written to the html output directory.
|
||||||
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
||||||
|
|
||||||
CHM_FILE =
|
CHM_FILE =
|
||||||
|
|
||||||
# The HHC_LOCATION tag can be used to specify the location (absolute path
|
# The HHC_LOCATION tag can be used to specify the location (absolute path
|
||||||
# including file name) of the HTML help compiler ( hhc.exe). If non-empty
|
# including file name) of the HTML help compiler ( hhc.exe). If non-empty
|
||||||
|
@ -1264,7 +1264,7 @@ CHM_FILE =
|
||||||
# The file has to be specified with full path.
|
# The file has to be specified with full path.
|
||||||
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
||||||
|
|
||||||
HHC_LOCATION =
|
HHC_LOCATION =
|
||||||
|
|
||||||
# The GENERATE_CHI flag controls if a separate .chi index file is generated (
|
# The GENERATE_CHI flag controls if a separate .chi index file is generated (
|
||||||
# YES) or that it should be included in the master .chm file ( NO).
|
# YES) or that it should be included in the master .chm file ( NO).
|
||||||
|
@ -1277,7 +1277,7 @@ GENERATE_CHI = NO
|
||||||
# and project file content.
|
# and project file content.
|
||||||
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
|
||||||
|
|
||||||
CHM_INDEX_ENCODING =
|
CHM_INDEX_ENCODING =
|
||||||
|
|
||||||
# The BINARY_TOC flag controls whether a binary table of contents is generated (
|
# The BINARY_TOC flag controls whether a binary table of contents is generated (
|
||||||
# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
|
# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
|
||||||
|
@ -1308,7 +1308,7 @@ GENERATE_QHP = NO
|
||||||
# the HTML output folder.
|
# the HTML output folder.
|
||||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||||
|
|
||||||
QCH_FILE =
|
QCH_FILE =
|
||||||
|
|
||||||
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
|
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
|
||||||
# Project output. For more information please see Qt Help Project / Namespace
|
# Project output. For more information please see Qt Help Project / Namespace
|
||||||
|
@ -1333,7 +1333,7 @@ QHP_VIRTUAL_FOLDER = doc
|
||||||
# filters).
|
# filters).
|
||||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||||
|
|
||||||
QHP_CUST_FILTER_NAME =
|
QHP_CUST_FILTER_NAME =
|
||||||
|
|
||||||
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
|
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
|
||||||
# custom filter to add. For more information please see Qt Help Project / Custom
|
# custom filter to add. For more information please see Qt Help Project / Custom
|
||||||
|
@ -1341,21 +1341,21 @@ QHP_CUST_FILTER_NAME =
|
||||||
# filters).
|
# filters).
|
||||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||||
|
|
||||||
QHP_CUST_FILTER_ATTRS =
|
QHP_CUST_FILTER_ATTRS =
|
||||||
|
|
||||||
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
|
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
|
||||||
# project's filter section matches. Qt Help Project / Filter Attributes (see:
|
# project's filter section matches. Qt Help Project / Filter Attributes (see:
|
||||||
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
|
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
|
||||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||||
|
|
||||||
QHP_SECT_FILTER_ATTRS =
|
QHP_SECT_FILTER_ATTRS =
|
||||||
|
|
||||||
# The QHG_LOCATION tag can be used to specify the location of Qt's
|
# The QHG_LOCATION tag can be used to specify the location of Qt's
|
||||||
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
|
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
|
||||||
# generated .qhp file.
|
# generated .qhp file.
|
||||||
# This tag requires that the tag GENERATE_QHP is set to YES.
|
# This tag requires that the tag GENERATE_QHP is set to YES.
|
||||||
|
|
||||||
QHG_LOCATION =
|
QHG_LOCATION =
|
||||||
|
|
||||||
# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
|
# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
|
||||||
# generated, together with the HTML files, they form an Eclipse help plugin. To
|
# generated, together with the HTML files, they form an Eclipse help plugin. To
|
||||||
|
@ -1488,7 +1488,7 @@ MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
|
||||||
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
|
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
|
||||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||||
|
|
||||||
MATHJAX_EXTENSIONS =
|
MATHJAX_EXTENSIONS =
|
||||||
|
|
||||||
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
|
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
|
||||||
# of code that will be used on startup of the MathJax code. See the MathJax site
|
# of code that will be used on startup of the MathJax code. See the MathJax site
|
||||||
|
@ -1496,7 +1496,7 @@ MATHJAX_EXTENSIONS =
|
||||||
# example see the documentation.
|
# example see the documentation.
|
||||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||||
|
|
||||||
MATHJAX_CODEFILE =
|
MATHJAX_CODEFILE =
|
||||||
|
|
||||||
# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
|
# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
|
||||||
# the HTML output. The underlying search engine uses javascript and DHTML and
|
# the HTML output. The underlying search engine uses javascript and DHTML and
|
||||||
|
@ -1556,7 +1556,7 @@ EXTERNAL_SEARCH = NO
|
||||||
# Searching" for details.
|
# Searching" for details.
|
||||||
# This tag requires that the tag SEARCHENGINE is set to YES.
|
# This tag requires that the tag SEARCHENGINE is set to YES.
|
||||||
|
|
||||||
SEARCHENGINE_URL =
|
SEARCHENGINE_URL =
|
||||||
|
|
||||||
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
|
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
|
||||||
# search data is written to a file for indexing by an external tool. With the
|
# search data is written to a file for indexing by an external tool. With the
|
||||||
|
@ -1572,7 +1572,7 @@ SEARCHDATA_FILE = searchdata.xml
|
||||||
# projects and redirect the results back to the right project.
|
# projects and redirect the results back to the right project.
|
||||||
# This tag requires that the tag SEARCHENGINE is set to YES.
|
# This tag requires that the tag SEARCHENGINE is set to YES.
|
||||||
|
|
||||||
EXTERNAL_SEARCH_ID =
|
EXTERNAL_SEARCH_ID =
|
||||||
|
|
||||||
# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
|
# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
|
||||||
# projects other than the one defined by this configuration file, but that are
|
# projects other than the one defined by this configuration file, but that are
|
||||||
|
@ -1582,7 +1582,7 @@ EXTERNAL_SEARCH_ID =
|
||||||
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
|
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
|
||||||
# This tag requires that the tag SEARCHENGINE is set to YES.
|
# This tag requires that the tag SEARCHENGINE is set to YES.
|
||||||
|
|
||||||
EXTRA_SEARCH_MAPPINGS =
|
EXTRA_SEARCH_MAPPINGS =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the LaTeX output
|
# Configuration options related to the LaTeX output
|
||||||
|
@ -1643,7 +1643,7 @@ PAPER_TYPE = a4
|
||||||
# If left blank no extra packages will be included.
|
# If left blank no extra packages will be included.
|
||||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||||
|
|
||||||
EXTRA_PACKAGES =
|
EXTRA_PACKAGES =
|
||||||
|
|
||||||
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
|
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
|
||||||
# generated LaTeX document. The header should contain everything until the first
|
# generated LaTeX document. The header should contain everything until the first
|
||||||
|
@ -1659,7 +1659,7 @@ EXTRA_PACKAGES =
|
||||||
# HTML_HEADER.
|
# HTML_HEADER.
|
||||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||||
|
|
||||||
LATEX_HEADER =
|
LATEX_HEADER =
|
||||||
|
|
||||||
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
|
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
|
||||||
# generated LaTeX document. The footer should contain everything after the last
|
# generated LaTeX document. The footer should contain everything after the last
|
||||||
|
@ -1670,7 +1670,7 @@ LATEX_HEADER =
|
||||||
# Note: Only use a user-defined footer if you know what you are doing!
|
# Note: Only use a user-defined footer if you know what you are doing!
|
||||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||||
|
|
||||||
LATEX_FOOTER =
|
LATEX_FOOTER =
|
||||||
|
|
||||||
# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
|
# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
|
||||||
# other source files which should be copied to the LATEX_OUTPUT output
|
# other source files which should be copied to the LATEX_OUTPUT output
|
||||||
|
@ -1678,7 +1678,7 @@ LATEX_FOOTER =
|
||||||
# markers available.
|
# markers available.
|
||||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||||
|
|
||||||
LATEX_EXTRA_FILES =
|
LATEX_EXTRA_FILES =
|
||||||
|
|
||||||
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
|
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
|
||||||
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
|
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
|
||||||
|
@ -1778,14 +1778,14 @@ RTF_HYPERLINKS = NO
|
||||||
# default style sheet that doxygen normally uses.
|
# default style sheet that doxygen normally uses.
|
||||||
# This tag requires that the tag GENERATE_RTF is set to YES.
|
# This tag requires that the tag GENERATE_RTF is set to YES.
|
||||||
|
|
||||||
RTF_STYLESHEET_FILE =
|
RTF_STYLESHEET_FILE =
|
||||||
|
|
||||||
# Set optional variables used in the generation of an RTF document. Syntax is
|
# Set optional variables used in the generation of an RTF document. Syntax is
|
||||||
# similar to doxygen's config file. A template extensions file can be generated
|
# similar to doxygen's config file. A template extensions file can be generated
|
||||||
# using doxygen -e rtf extensionFile.
|
# using doxygen -e rtf extensionFile.
|
||||||
# This tag requires that the tag GENERATE_RTF is set to YES.
|
# This tag requires that the tag GENERATE_RTF is set to YES.
|
||||||
|
|
||||||
RTF_EXTENSIONS_FILE =
|
RTF_EXTENSIONS_FILE =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the man page output
|
# Configuration options related to the man page output
|
||||||
|
@ -1820,7 +1820,7 @@ MAN_EXTENSION = .3
|
||||||
# MAN_EXTENSION with the initial . removed.
|
# MAN_EXTENSION with the initial . removed.
|
||||||
# This tag requires that the tag GENERATE_MAN is set to YES.
|
# This tag requires that the tag GENERATE_MAN is set to YES.
|
||||||
|
|
||||||
MAN_SUBDIR =
|
MAN_SUBDIR =
|
||||||
|
|
||||||
# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
|
# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
|
||||||
# will generate one additional man file for each entity documented in the real
|
# will generate one additional man file for each entity documented in the real
|
||||||
|
@ -1933,7 +1933,7 @@ PERLMOD_PRETTY = YES
|
||||||
# overwrite each other's variables.
|
# overwrite each other's variables.
|
||||||
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
|
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
|
||||||
|
|
||||||
PERLMOD_MAKEVAR_PREFIX =
|
PERLMOD_MAKEVAR_PREFIX =
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the preprocessor
|
# Configuration options related to the preprocessor
|
||||||
|
@ -1974,7 +1974,7 @@ SEARCH_INCLUDES = YES
|
||||||
# preprocessor.
|
# preprocessor.
|
||||||
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
|
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
|
||||||
|
|
||||||
INCLUDE_PATH =
|
INCLUDE_PATH =
|
||||||
|
|
||||||
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
|
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
|
||||||
# patterns (like *.h and *.hpp) to filter out the header-files in the
|
# patterns (like *.h and *.hpp) to filter out the header-files in the
|
||||||
|
@ -1982,7 +1982,7 @@ INCLUDE_PATH =
|
||||||
# used.
|
# used.
|
||||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||||
|
|
||||||
INCLUDE_FILE_PATTERNS =
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
|
||||||
# The PREDEFINED tag can be used to specify one or more macro names that are
|
# The PREDEFINED tag can be used to specify one or more macro names that are
|
||||||
# defined before the preprocessor is started (similar to the -D option of e.g.
|
# defined before the preprocessor is started (similar to the -D option of e.g.
|
||||||
|
@ -1992,7 +1992,7 @@ INCLUDE_FILE_PATTERNS =
|
||||||
# recursively expanded use the := operator instead of the = operator.
|
# recursively expanded use the := operator instead of the = operator.
|
||||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||||
|
|
||||||
PREDEFINED =
|
PREDEFINED =
|
||||||
|
|
||||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
|
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
|
||||||
# tag can be used to specify a list of macro names that should be expanded. The
|
# tag can be used to specify a list of macro names that should be expanded. The
|
||||||
|
@ -2001,7 +2001,7 @@ PREDEFINED =
|
||||||
# definition found in the source code.
|
# definition found in the source code.
|
||||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||||
|
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
|
|
||||||
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
||||||
# remove all references to function-like macros that are alone on a line, have
|
# remove all references to function-like macros that are alone on a line, have
|
||||||
|
@ -2030,13 +2030,13 @@ SKIP_FUNCTION_MACROS = YES
|
||||||
# the path). If a tag file is not located in the directory in which doxygen is
|
# the path). If a tag file is not located in the directory in which doxygen is
|
||||||
# run, you must also specify the path to the tagfile here.
|
# run, you must also specify the path to the tagfile here.
|
||||||
|
|
||||||
TAGFILES =
|
TAGFILES =
|
||||||
|
|
||||||
# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
|
# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
|
||||||
# tag file that is based on the input files it reads. See section "Linking to
|
# tag file that is based on the input files it reads. See section "Linking to
|
||||||
# external documentation" for more information about the usage of tag files.
|
# external documentation" for more information about the usage of tag files.
|
||||||
|
|
||||||
GENERATE_TAGFILE =
|
GENERATE_TAGFILE =
|
||||||
|
|
||||||
# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
|
# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
|
||||||
# class index. If set to NO only the inherited external classes will be listed.
|
# class index. If set to NO only the inherited external classes will be listed.
|
||||||
|
@ -2084,14 +2084,14 @@ CLASS_DIAGRAMS = YES
|
||||||
# the mscgen tool resides. If left empty the tool is assumed to be found in the
|
# the mscgen tool resides. If left empty the tool is assumed to be found in the
|
||||||
# default search path.
|
# default search path.
|
||||||
|
|
||||||
MSCGEN_PATH =
|
MSCGEN_PATH =
|
||||||
|
|
||||||
# You can include diagrams made with dia in doxygen documentation. Doxygen will
|
# You can include diagrams made with dia in doxygen documentation. Doxygen will
|
||||||
# then run dia to produce the diagram and insert it in the documentation. The
|
# then run dia to produce the diagram and insert it in the documentation. The
|
||||||
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
|
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
|
||||||
# If left empty dia is assumed to be found in the default search path.
|
# If left empty dia is assumed to be found in the default search path.
|
||||||
|
|
||||||
DIA_PATH =
|
DIA_PATH =
|
||||||
|
|
||||||
# If set to YES, the inheritance and collaboration graphs will hide inheritance
|
# If set to YES, the inheritance and collaboration graphs will hide inheritance
|
||||||
# and usage relations if the target is undocumented or is not a class.
|
# and usage relations if the target is undocumented or is not a class.
|
||||||
|
@ -2140,7 +2140,7 @@ DOT_FONTSIZE = 10
|
||||||
# the path where dot can find it using this tag.
|
# the path where dot can find it using this tag.
|
||||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||||
|
|
||||||
DOT_FONTPATH =
|
DOT_FONTPATH =
|
||||||
|
|
||||||
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
|
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
|
||||||
# each documented class showing the direct and indirect inheritance relations.
|
# each documented class showing the direct and indirect inheritance relations.
|
||||||
|
@ -2278,26 +2278,26 @@ INTERACTIVE_SVG = NO
|
||||||
# found. If left blank, it is assumed the dot tool can be found in the path.
|
# found. If left blank, it is assumed the dot tool can be found in the path.
|
||||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||||
|
|
||||||
DOT_PATH =
|
DOT_PATH =
|
||||||
|
|
||||||
# The DOTFILE_DIRS tag can be used to specify one or more directories that
|
# The DOTFILE_DIRS tag can be used to specify one or more directories that
|
||||||
# contain dot files that are included in the documentation (see the \dotfile
|
# contain dot files that are included in the documentation (see the \dotfile
|
||||||
# command).
|
# command).
|
||||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||||
|
|
||||||
DOTFILE_DIRS =
|
DOTFILE_DIRS =
|
||||||
|
|
||||||
# The MSCFILE_DIRS tag can be used to specify one or more directories that
|
# The MSCFILE_DIRS tag can be used to specify one or more directories that
|
||||||
# contain msc files that are included in the documentation (see the \mscfile
|
# contain msc files that are included in the documentation (see the \mscfile
|
||||||
# command).
|
# command).
|
||||||
|
|
||||||
MSCFILE_DIRS =
|
MSCFILE_DIRS =
|
||||||
|
|
||||||
# The DIAFILE_DIRS tag can be used to specify one or more directories that
|
# The DIAFILE_DIRS tag can be used to specify one or more directories that
|
||||||
# contain dia files that are included in the documentation (see the \diafile
|
# contain dia files that are included in the documentation (see the \diafile
|
||||||
# command).
|
# command).
|
||||||
|
|
||||||
DIAFILE_DIRS =
|
DIAFILE_DIRS =
|
||||||
|
|
||||||
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
|
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
|
||||||
# path where java can find the plantuml.jar file. If left blank, it is assumed
|
# path where java can find the plantuml.jar file. If left blank, it is assumed
|
||||||
|
@ -2306,7 +2306,7 @@ DIAFILE_DIRS =
|
||||||
# will not generate output for the diagram.
|
# will not generate output for the diagram.
|
||||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||||
|
|
||||||
PLANTUML_JAR_PATH =
|
PLANTUML_JAR_PATH =
|
||||||
|
|
||||||
# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
|
# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
|
||||||
# that will be shown in the graph. If the number of nodes in a graph becomes
|
# that will be shown in the graph. If the number of nodes in a graph becomes
|
||||||
|
|
|
@ -28,5 +28,5 @@ If you like, you can [donate by PayPal](https://www.paypal.com/cgi-bin/webscr?cm
|
||||||
* Infrastructure setup
|
* Infrastructure setup
|
||||||
* Eventually 3D displays to get proper 3D output working
|
* Eventually 3D displays to get proper 3D output working
|
||||||
* ... etc ...
|
* ... etc ...
|
||||||
|
|
||||||
We also more than gladly accept used 3DS consoles, preferrably ones with firmware 4.5 or lower! If you would like to give yours away, don't hesitate to join our IRC channel #citra on [Freenode](http://webchat.freenode.net/?channels=citra) and talk to neobrain or bunnei. Mind you, IRC is slow-paced, so it might be a while until people reply. If you're in a hurry you can just leave contact details in the channel or via private message and we'll get back to you.
|
We also more than gladly accept used 3DS consoles, preferrably ones with firmware 4.5 or lower! If you would like to give yours away, don't hesitate to join our IRC channel #citra on [Freenode](http://webchat.freenode.net/?channels=citra) and talk to neobrain or bunnei. Mind you, IRC is slow-paced, so it might be a while until people reply. If you're in a hurry you can just leave contact details in the channel or via private message and we'll get back to you.
|
||||||
|
|
|
@ -35,11 +35,11 @@ after_build:
|
||||||
$BUILD_NAME = "citra-${GITDATE}-${GITREV}-windows-amd64.7z" -replace " ",""
|
$BUILD_NAME = "citra-${GITDATE}-${GITREV}-windows-amd64.7z" -replace " ",""
|
||||||
# Zip up the build folder
|
# Zip up the build folder
|
||||||
7z a $BUILD_NAME .\build\bin\release\*
|
7z a $BUILD_NAME .\build\bin\release\*
|
||||||
|
|
||||||
# Download winscp
|
# Download winscp
|
||||||
Invoke-WebRequest "http://hivelocity.dl.sourceforge.net/project/winscp/WinSCP/5.7/winscp570.zip" -OutFile "winscp570.zip"
|
Invoke-WebRequest "http://hivelocity.dl.sourceforge.net/project/winscp/WinSCP/5.7/winscp570.zip" -OutFile "winscp570.zip"
|
||||||
7z e -y winscp570.zip
|
7z e -y winscp570.zip
|
||||||
|
|
||||||
# Upload to server
|
# Upload to server
|
||||||
.\WinSCP.com /command `
|
.\WinSCP.com /command `
|
||||||
"option batch abort" `
|
"option batch abort" `
|
||||||
|
|
Binary file not shown.
|
@ -89,15 +89,15 @@ if (Qt5_FOUND AND MSVC)
|
||||||
)
|
)
|
||||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||||
set(PLATFORMS ${DLL_DEST}platforms/)
|
set(PLATFORMS ${DLL_DEST}platforms/)
|
||||||
|
|
||||||
# windows commandline expects the / to be \ so switch them
|
# windows commandline expects the / to be \ so switch them
|
||||||
string(REPLACE "/" "\\" Qt5_DLL_DIR ${Qt5_DLL_DIR})
|
string(REPLACE "/" "\\" Qt5_DLL_DIR ${Qt5_DLL_DIR})
|
||||||
string(REPLACE "/" "\\" Qt5_PLATFORMS_DIR ${Qt5_PLATFORMS_DIR})
|
string(REPLACE "/" "\\" Qt5_PLATFORMS_DIR ${Qt5_PLATFORMS_DIR})
|
||||||
string(REPLACE "/" "\\" DLL_DEST ${DLL_DEST})
|
string(REPLACE "/" "\\" DLL_DEST ${DLL_DEST})
|
||||||
string(REPLACE "/" "\\" PLATFORMS ${PLATFORMS})
|
string(REPLACE "/" "\\" PLATFORMS ${PLATFORMS})
|
||||||
|
|
||||||
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
||||||
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
||||||
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
||||||
add_custom_command(TARGET citra-qt POST_BUILD
|
add_custom_command(TARGET citra-qt POST_BUILD
|
||||||
COMMAND robocopy ${Qt5_DLL_DIR} ${DLL_DEST} ${Qt5_DLLS} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
COMMAND robocopy ${Qt5_DLL_DIR} ${DLL_DEST} ${Qt5_DLLS} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
||||||
|
|
|
@ -57,7 +57,7 @@ void EmuThread::run() {
|
||||||
Core::SingleStep();
|
Core::SingleStep();
|
||||||
emit DebugModeEntered();
|
emit DebugModeEntered();
|
||||||
yieldCurrentThread();
|
yieldCurrentThread();
|
||||||
|
|
||||||
was_active = false;
|
was_active = false;
|
||||||
} else {
|
} else {
|
||||||
std::unique_lock<std::mutex> lock(running_mutex);
|
std::unique_lock<std::mutex> lock(running_mutex);
|
||||||
|
|
|
@ -80,7 +80,7 @@ signals:
|
||||||
* @warning When connecting to this signal from other threads, make sure to specify either Qt::QueuedConnection (invoke slot within the destination object's message thread) or even Qt::BlockingQueuedConnection (additionally block source thread until slot returns)
|
* @warning When connecting to this signal from other threads, make sure to specify either Qt::QueuedConnection (invoke slot within the destination object's message thread) or even Qt::BlockingQueuedConnection (additionally block source thread until slot returns)
|
||||||
*/
|
*/
|
||||||
void DebugModeEntered();
|
void DebugModeEntered();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emitted right before the CPU continues execution
|
* Emitted right before the CPU continues execution
|
||||||
*
|
*
|
||||||
|
|
|
@ -39,7 +39,7 @@ void CallstackWidget::OnDebugModeEntered()
|
||||||
{
|
{
|
||||||
ret_addr = Memory::Read32(addr);
|
ret_addr = Memory::Read32(addr);
|
||||||
call_addr = ret_addr - 4; //get call address???
|
call_addr = ret_addr - 4; //get call address???
|
||||||
|
|
||||||
if (Memory::GetPointer(call_addr) == nullptr)
|
if (Memory::GetPointer(call_addr) == nullptr)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
|
||||||
|
|
||||||
ui.action_Use_Hardware_Renderer->setChecked(Settings::values.use_hw_renderer);
|
ui.action_Use_Hardware_Renderer->setChecked(Settings::values.use_hw_renderer);
|
||||||
SetHardwareRendererEnabled(ui.action_Use_Hardware_Renderer->isChecked());
|
SetHardwareRendererEnabled(ui.action_Use_Hardware_Renderer->isChecked());
|
||||||
|
|
||||||
ui.action_Single_Window_Mode->setChecked(settings.value("singleWindowMode", true).toBool());
|
ui.action_Single_Window_Mode->setChecked(settings.value("singleWindowMode", true).toBool());
|
||||||
ToggleWindowMode();
|
ToggleWindowMode();
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ std::tuple<unsigned,unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsig
|
||||||
|
|
||||||
new_x = std::max(new_x, framebuffer_layout.bottom_screen.left);
|
new_x = std::max(new_x, framebuffer_layout.bottom_screen.left);
|
||||||
new_x = std::min(new_x, framebuffer_layout.bottom_screen.right-1);
|
new_x = std::min(new_x, framebuffer_layout.bottom_screen.right-1);
|
||||||
|
|
||||||
new_y = std::max(new_y, framebuffer_layout.bottom_screen.top);
|
new_y = std::max(new_y, framebuffer_layout.bottom_screen.top);
|
||||||
new_y = std::min(new_y, framebuffer_layout.bottom_screen.bottom-1);
|
new_y = std::min(new_y, framebuffer_layout.bottom_screen.bottom-1);
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <direct.h> // getcwd
|
#include <direct.h> // getcwd
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
// 64 bit offsets for windows
|
// 64 bit offsets for windows
|
||||||
#define fseeko _fseeki64
|
#define fseeko _fseeki64
|
||||||
#define ftello _ftelli64
|
#define ftello _ftelli64
|
||||||
|
|
|
@ -135,7 +135,7 @@ template <>
|
||||||
inline void swap<8>(u8* data) {
|
inline void swap<8>(u8* data) {
|
||||||
*reinterpret_cast<u64*>(data) = swap64(data);
|
*reinterpret_cast<u64*>(data) = swap64(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Namespace Common
|
} // Namespace Common
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -813,7 +813,7 @@ Opcode ARM_Disasm::Decode11(uint32_t insn) {
|
||||||
// SWI
|
// SWI
|
||||||
return OP_SWI;
|
return OP_SWI;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t bit4 = (insn >> 4) & 0x1;
|
uint8_t bit4 = (insn >> 4) & 0x1;
|
||||||
uint8_t cpnum = (insn >> 8) & 0xf;
|
uint8_t cpnum = (insn >> 8) & 0xf;
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ static unsigned int DPO(Immediate)(ARMul_State* cpu, unsigned int sht_oper) {
|
||||||
unsigned int immed_8 = BITS(sht_oper, 0, 7);
|
unsigned int immed_8 = BITS(sht_oper, 0, 7);
|
||||||
unsigned int rotate_imm = BITS(sht_oper, 8, 11);
|
unsigned int rotate_imm = BITS(sht_oper, 8, 11);
|
||||||
unsigned int shifter_operand = ROTATE_RIGHT_32(immed_8, rotate_imm * 2);
|
unsigned int shifter_operand = ROTATE_RIGHT_32(immed_8, rotate_imm * 2);
|
||||||
if (rotate_imm == 0)
|
if (rotate_imm == 0)
|
||||||
cpu->shifter_carry_out = cpu->CFlag;
|
cpu->shifter_carry_out = cpu->CFlag;
|
||||||
else
|
else
|
||||||
cpu->shifter_carry_out = BIT(shifter_operand, 31);
|
cpu->shifter_carry_out = BIT(shifter_operand, 31);
|
||||||
|
@ -521,7 +521,7 @@ static void MLnS(ImmediateOffset)(ARMul_State* cpu, unsigned int inst, unsigned
|
||||||
addr = CHECK_READ_REG15_WA(cpu, Rn) + offset_8;
|
addr = CHECK_READ_REG15_WA(cpu, Rn) + offset_8;
|
||||||
else
|
else
|
||||||
addr = CHECK_READ_REG15_WA(cpu, Rn) - offset_8;
|
addr = CHECK_READ_REG15_WA(cpu, Rn) - offset_8;
|
||||||
|
|
||||||
virt_addr = addr;
|
virt_addr = addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +550,7 @@ static void MLnS(ImmediatePreIndexed)(ARMul_State* cpu, unsigned int inst, unsig
|
||||||
|
|
||||||
if (U_BIT)
|
if (U_BIT)
|
||||||
addr = rn + offset_8;
|
addr = rn + offset_8;
|
||||||
else
|
else
|
||||||
addr = rn - offset_8;
|
addr = rn - offset_8;
|
||||||
|
|
||||||
virt_addr = addr;
|
virt_addr = addr;
|
||||||
|
@ -1306,8 +1306,8 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(and)(unsigned int inst, int index)
|
||||||
inst_cream->Rd = BITS(inst, 12, 15);
|
inst_cream->Rd = BITS(inst, 12, 15);
|
||||||
inst_cream->shifter_operand = BITS(inst, 0, 11);
|
inst_cream->shifter_operand = BITS(inst, 0, 11);
|
||||||
inst_cream->shtop_func = get_shtop(inst);
|
inst_cream->shtop_func = get_shtop(inst);
|
||||||
|
|
||||||
if (inst_cream->Rd == 15)
|
if (inst_cream->Rd == 15)
|
||||||
inst_base->br = INDIRECT_BRANCH;
|
inst_base->br = INDIRECT_BRANCH;
|
||||||
|
|
||||||
return inst_base;
|
return inst_base;
|
||||||
|
@ -1350,7 +1350,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(bic)(unsigned int inst, int index)
|
||||||
inst_cream->shifter_operand = BITS(inst, 0, 11);
|
inst_cream->shifter_operand = BITS(inst, 0, 11);
|
||||||
inst_cream->shtop_func = get_shtop(inst);
|
inst_cream->shtop_func = get_shtop(inst);
|
||||||
|
|
||||||
if (inst_cream->Rd == 15)
|
if (inst_cream->Rd == 15)
|
||||||
inst_base->br = INDIRECT_BRANCH;
|
inst_base->br = INDIRECT_BRANCH;
|
||||||
return inst_base;
|
return inst_base;
|
||||||
}
|
}
|
||||||
|
@ -3269,7 +3269,7 @@ static ARM_INST_PTR INTERPRETER_TRANSLATE(yield)(unsigned int inst, int index)
|
||||||
#define VFP_INTERPRETER_STRUCT
|
#define VFP_INTERPRETER_STRUCT
|
||||||
#include "core/arm/skyeye_common/vfp/vfpinstr.cpp"
|
#include "core/arm/skyeye_common/vfp/vfpinstr.cpp"
|
||||||
#undef VFP_INTERPRETER_STRUCT
|
#undef VFP_INTERPRETER_STRUCT
|
||||||
|
|
||||||
#define VFP_INTERPRETER_TRANS
|
#define VFP_INTERPRETER_TRANS
|
||||||
#include "core/arm/skyeye_common/vfp/vfpinstr.cpp"
|
#include "core/arm/skyeye_common/vfp/vfpinstr.cpp"
|
||||||
#undef VFP_INTERPRETER_TRANS
|
#undef VFP_INTERPRETER_TRANS
|
||||||
|
@ -3478,9 +3478,9 @@ const transop_fp_t arm_instruction_trans[] = {
|
||||||
INTERPRETER_TRANSLATE(bbl),
|
INTERPRETER_TRANSLATE(bbl),
|
||||||
|
|
||||||
// All the thumb instructions should be placed the end of table
|
// All the thumb instructions should be placed the end of table
|
||||||
INTERPRETER_TRANSLATE(b_2_thumb),
|
INTERPRETER_TRANSLATE(b_2_thumb),
|
||||||
INTERPRETER_TRANSLATE(b_cond_thumb),
|
INTERPRETER_TRANSLATE(b_cond_thumb),
|
||||||
INTERPRETER_TRANSLATE(bl_1_thumb),
|
INTERPRETER_TRANSLATE(bl_1_thumb),
|
||||||
INTERPRETER_TRANSLATE(bl_2_thumb),
|
INTERPRETER_TRANSLATE(bl_2_thumb),
|
||||||
INTERPRETER_TRANSLATE(blx_1_thumb)
|
INTERPRETER_TRANSLATE(blx_1_thumb)
|
||||||
};
|
};
|
||||||
|
@ -4338,7 +4338,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (BIT(inst, 13)) {
|
if (BIT(inst, 13)) {
|
||||||
if (cpu->Mode == USER32MODE)
|
if (cpu->Mode == USER32MODE)
|
||||||
cpu->Reg[13] = ReadMemory32(cpu, addr);
|
cpu->Reg[13] = ReadMemory32(cpu, addr);
|
||||||
else
|
else
|
||||||
cpu->Reg_usr[0] = ReadMemory32(cpu, addr);
|
cpu->Reg_usr[0] = ReadMemory32(cpu, addr);
|
||||||
|
@ -4346,7 +4346,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
|
||||||
addr += 4;
|
addr += 4;
|
||||||
}
|
}
|
||||||
if (BIT(inst, 14)) {
|
if (BIT(inst, 14)) {
|
||||||
if (cpu->Mode == USER32MODE)
|
if (cpu->Mode == USER32MODE)
|
||||||
cpu->Reg[14] = ReadMemory32(cpu, addr);
|
cpu->Reg[14] = ReadMemory32(cpu, addr);
|
||||||
else
|
else
|
||||||
cpu->Reg_usr[1] = ReadMemory32(cpu, addr);
|
cpu->Reg_usr[1] = ReadMemory32(cpu, addr);
|
||||||
|
@ -5148,7 +5148,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
|
||||||
REV16_INST:
|
REV16_INST:
|
||||||
REVSH_INST:
|
REVSH_INST:
|
||||||
{
|
{
|
||||||
|
|
||||||
if (inst_base->cond == 0xE || CondPassed(cpu, inst_base->cond)) {
|
if (inst_base->cond == 0xE || CondPassed(cpu, inst_base->cond)) {
|
||||||
rev_inst* const inst_cream = (rev_inst*)inst_base->component;
|
rev_inst* const inst_cream = (rev_inst*)inst_base->component;
|
||||||
|
|
||||||
|
@ -5721,7 +5721,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
|
||||||
|
|
||||||
if (do_swap)
|
if (do_swap)
|
||||||
rm_val = (((rm_val & 0xFFFF) << 16) | (rm_val >> 16));
|
rm_val = (((rm_val & 0xFFFF) << 16) | (rm_val >> 16));
|
||||||
|
|
||||||
const s32 product1 = (s16)(rn_val & 0xFFFF) * (s16)(rm_val & 0xFFFF);
|
const s32 product1 = (s16)(rn_val & 0xFFFF) * (s16)(rm_val & 0xFFFF);
|
||||||
const s32 product2 = (s16)((rn_val >> 16) & 0xFFFF) * (s16)((rm_val >> 16) & 0xFFFF);
|
const s32 product2 = (s16)((rn_val >> 16) & 0xFFFF) * (s16)((rm_val >> 16) & 0xFFFF);
|
||||||
s64 result;
|
s64 result;
|
||||||
|
@ -6583,7 +6583,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
|
||||||
{
|
{
|
||||||
u32 lo_val = 0;
|
u32 lo_val = 0;
|
||||||
u32 hi_val = 0;
|
u32 hi_val = 0;
|
||||||
|
|
||||||
// UHADD16
|
// UHADD16
|
||||||
if (op2 == 0x00) {
|
if (op2 == 0x00) {
|
||||||
lo_val = (rn_val & 0xFFFF) + (rm_val & 0xFFFF);
|
lo_val = (rn_val & 0xFFFF) + (rm_val & 0xFFFF);
|
||||||
|
@ -6772,7 +6772,7 @@ unsigned InterpreterMainLoop(ARMul_State* cpu) {
|
||||||
|
|
||||||
u16 lo_val = 0;
|
u16 lo_val = 0;
|
||||||
u16 hi_val = 0;
|
u16 hi_val = 0;
|
||||||
|
|
||||||
// UQADD16
|
// UQADD16
|
||||||
if (op2 == 0x00) {
|
if (op2 == 0x00) {
|
||||||
lo_val = ARMul_UnsignedSaturatedAdd16(rn_val & 0xFFFF, rm_val & 0xFFFF);
|
lo_val = ARMul_UnsignedSaturatedAdd16(rn_val & 0xFFFF, rm_val & 0xFFFF);
|
||||||
|
|
|
@ -184,7 +184,7 @@ tdstate thumb_translate(u32 addr, u32 instr, u32* ainstr, u32* inst_size) {
|
||||||
case 9: // LDR Rd,[PC,#imm8]
|
case 9: // LDR Rd,[PC,#imm8]
|
||||||
*ainstr = 0xE59F0000 // base
|
*ainstr = 0xE59F0000 // base
|
||||||
| ((tinstr & 0x0700) << (12 - 8)) // Rd
|
| ((tinstr & 0x0700) << (12 - 8)) // Rd
|
||||||
|((tinstr & 0x00FF) << (2 - 0)); // off8
|
|((tinstr & 0x00FF) << (2 - 0)); // off8
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 10:
|
||||||
|
|
|
@ -628,7 +628,7 @@ void WriteCP15Register(ARMul_State* cpu, u32 value, u32 crn, u32 opcode_1, u32 c
|
||||||
cpu->CP15[CP15_DATA_SYNC_BARRIER] = value;
|
cpu->CP15[CP15_DATA_SYNC_BARRIER] = value;
|
||||||
else if (opcode_2 == 5)
|
else if (opcode_2 == 5)
|
||||||
cpu->CP15[CP15_DATA_MEMORY_BARRIER] = value;
|
cpu->CP15[CP15_DATA_MEMORY_BARRIER] = value;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (crn == 13 && opcode_1 == 0 && crm == 0 && opcode_2 == 2)
|
else if (crn == 13 && opcode_1 == 0 && crm == 0 && opcode_2 == 2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
/* armdefs.h -- ARMulator common definitions: ARM6 Instruction Emulator.
|
/* armdefs.h -- ARMulator common definitions: ARM6 Instruction Emulator.
|
||||||
Copyright (C) 1994 Advanced RISC Machines Ltd.
|
Copyright (C) 1994 Advanced RISC Machines Ltd.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
|
@ -18,10 +18,10 @@
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following code is derivative from Linux Android kernel vfp
|
* The following code is derivative from Linux Android kernel vfp
|
||||||
* floating point support.
|
* floating point support.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 ARM Limited.
|
* Copyright (C) 2004 ARM Limited.
|
||||||
* Written by Deep Blue Solutions Limited.
|
* Written by Deep Blue Solutions Limited.
|
||||||
*
|
*
|
||||||
|
|
|
@ -549,7 +549,7 @@ std::string GetScheduledEventsSummary() {
|
||||||
const char* name = event_types[event->type].name;
|
const char* name = event_types[event->type].name;
|
||||||
if (!name)
|
if (!name)
|
||||||
name = "[unknown]";
|
name = "[unknown]";
|
||||||
text += Common::StringFromFormat("%s : %i %08x%08x\n", name, (int)event->time,
|
text += Common::StringFromFormat("%s : %i %08x%08x\n", name, (int)event->time,
|
||||||
(u32)(event->userdata >> 32), (u32)(event->userdata));
|
(u32)(event->userdata >> 32), (u32)(event->userdata));
|
||||||
event = event->next;
|
event = event->next;
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ void UnregisterAllEvents();
|
||||||
/// userdata MAY NOT CONTAIN POINTERS. userdata might get written and reloaded from disk,
|
/// userdata MAY NOT CONTAIN POINTERS. userdata might get written and reloaded from disk,
|
||||||
/// when we implement state saves.
|
/// when we implement state saves.
|
||||||
/**
|
/**
|
||||||
* Schedules an event to run after the specified number of cycles,
|
* Schedules an event to run after the specified number of cycles,
|
||||||
* with an optional parameter to be passed to the callback handler.
|
* with an optional parameter to be passed to the callback handler.
|
||||||
* This must be run ONLY from within the cpu thread.
|
* This must be run ONLY from within the cpu thread.
|
||||||
* @param cycles_into_future The number of cycles after which this event will be fired
|
* @param cycles_into_future The number of cycles after which this event will be fired
|
||||||
|
|
|
@ -30,8 +30,8 @@ std::string GetExtSaveDataPath(const std::string& mount_point, const Path& path)
|
||||||
std::string GetExtDataContainerPath(const std::string& mount_point, bool shared) {
|
std::string GetExtDataContainerPath(const std::string& mount_point, bool shared) {
|
||||||
if (shared)
|
if (shared)
|
||||||
return Common::StringFromFormat("%sdata/%s/extdata/", mount_point.c_str(), SYSTEM_ID.c_str());
|
return Common::StringFromFormat("%sdata/%s/extdata/", mount_point.c_str(), SYSTEM_ID.c_str());
|
||||||
|
|
||||||
return Common::StringFromFormat("%sNintendo 3DS/%s/%s/extdata/", mount_point.c_str(),
|
return Common::StringFromFormat("%sNintendo 3DS/%s/%s/extdata/", mount_point.c_str(),
|
||||||
SYSTEM_ID.c_str(), SDCARD_ID.c_str());
|
SYSTEM_ID.c_str(), SDCARD_ID.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,14 +35,14 @@ public:
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* This holds the full directory path for this archive, it is only set after a successful call
|
* This holds the full directory path for this archive, it is only set after a successful call
|
||||||
* to Open, this is formed as <base extsavedatapath>/<type>/<high>/<low>.
|
* to Open, this is formed as <base extsavedatapath>/<type>/<high>/<low>.
|
||||||
* See GetExtSaveDataPath for the code that extracts this data from an archive path.
|
* See GetExtSaveDataPath for the code that extracts this data from an archive path.
|
||||||
*/
|
*/
|
||||||
std::string mount_point;
|
std::string mount_point;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a path to the concrete ExtData archive in the host filesystem based on the
|
* Constructs a path to the concrete ExtData archive in the host filesystem based on the
|
||||||
* input Path and base mount point.
|
* input Path and base mount point.
|
||||||
* @param mount_point The base mount point of the ExtSaveData archives.
|
* @param mount_point The base mount point of the ExtSaveData archives.
|
||||||
* @param path The path that identifies the requested concrete ExtSaveData archive.
|
* @param path The path that identifies the requested concrete ExtSaveData archive.
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
static std::string GetSaveDataContainerPath(const std::string& sdmc_directory) {
|
static std::string GetSaveDataContainerPath(const std::string& sdmc_directory) {
|
||||||
return Common::StringFromFormat("%sNintendo 3DS/%s/%s/title/", sdmc_directory.c_str(),
|
return Common::StringFromFormat("%sNintendo 3DS/%s/%s/title/", sdmc_directory.c_str(),
|
||||||
SYSTEM_ID.c_str(), SDCARD_ID.c_str());
|
SYSTEM_ID.c_str(), SDCARD_ID.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,13 +81,13 @@ public:
|
||||||
s32 max_timers = 0;
|
s32 max_timers = 0;
|
||||||
s32 max_shared_mems = 0;
|
s32 max_shared_mems = 0;
|
||||||
s32 max_address_arbiters = 0;
|
s32 max_address_arbiters = 0;
|
||||||
|
|
||||||
/// Max CPU time that the processes in this category can utilize
|
/// Max CPU time that the processes in this category can utilize
|
||||||
s32 max_cpu_time = 0;
|
s32 max_cpu_time = 0;
|
||||||
|
|
||||||
// TODO(Subv): Increment these in their respective Kernel::T::Create functions, keeping in mind that
|
// TODO(Subv): Increment these in their respective Kernel::T::Create functions, keeping in mind that
|
||||||
// APPLICATION resource limits should not be affected by the objects created by service modules.
|
// APPLICATION resource limits should not be affected by the objects created by service modules.
|
||||||
// Currently we have no way of distinguishing if a Create was called by the running application,
|
// Currently we have no way of distinguishing if a Create was called by the running application,
|
||||||
// or by a service module. Approach this once we have separated the service modules into their own processes
|
// or by a service module. Approach this once we have separated the service modules into their own processes
|
||||||
|
|
||||||
/// Current memory that the processes in this category are using
|
/// Current memory that the processes in this category are using
|
||||||
|
|
|
@ -42,7 +42,7 @@ void Semaphore::Acquire() {
|
||||||
|
|
||||||
ResultVal<s32> Semaphore::Release(s32 release_count) {
|
ResultVal<s32> Semaphore::Release(s32 release_count) {
|
||||||
if (max_count - available_count < release_count)
|
if (max_count - available_count < release_count)
|
||||||
return ResultCode(ErrorDescription::OutOfRange, ErrorModule::Kernel,
|
return ResultCode(ErrorDescription::OutOfRange, ErrorModule::Kernel,
|
||||||
ErrorSummary::InvalidArgument, ErrorLevel::Permanent);
|
ErrorSummary::InvalidArgument, ErrorLevel::Permanent);
|
||||||
|
|
||||||
s32 previous_count = available_count;
|
s32 previous_count = available_count;
|
||||||
|
|
|
@ -100,7 +100,7 @@ void Thread::Stop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
status = THREADSTATUS_DEAD;
|
status = THREADSTATUS_DEAD;
|
||||||
|
|
||||||
WakeupAllWaitingThreads();
|
WakeupAllWaitingThreads();
|
||||||
|
|
||||||
// Clean up any dangling references in objects that this thread was waiting for
|
// Clean up any dangling references in objects that this thread was waiting for
|
||||||
|
@ -169,7 +169,7 @@ static void PriorityBoostStarvedThreads() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switches the CPU's active thread context to that of the specified thread
|
* Switches the CPU's active thread context to that of the specified thread
|
||||||
* @param new_thread The thread to switch to
|
* @param new_thread The thread to switch to
|
||||||
*/
|
*/
|
||||||
|
@ -353,7 +353,7 @@ void Thread::ResumeFromWait() {
|
||||||
GetObjectId());
|
GetObjectId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ready_queue.push_back(current_priority, this);
|
ready_queue.push_back(current_priority, this);
|
||||||
status = THREADSTATUS_READY;
|
status = THREADSTATUS_READY;
|
||||||
}
|
}
|
||||||
|
@ -504,7 +504,7 @@ void Reschedule() {
|
||||||
} else if (next) {
|
} else if (next) {
|
||||||
LOG_TRACE(Kernel, "context switch idle -> %u", next->GetObjectId());
|
LOG_TRACE(Kernel, "context switch idle -> %u", next->GetObjectId());
|
||||||
}
|
}
|
||||||
|
|
||||||
SwitchContext(next);
|
SwitchContext(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ public:
|
||||||
* @return The thread's ID
|
* @return The thread's ID
|
||||||
*/
|
*/
|
||||||
u32 GetThreadId() const { return thread_id; }
|
u32 GetThreadId() const { return thread_id; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release an acquired wait object
|
* Release an acquired wait object
|
||||||
* @param wait_object WaitObject to release
|
* @param wait_object WaitObject to release
|
||||||
|
|
|
@ -88,7 +88,7 @@ static void TimerCallback(u64 timer_handle, int cycles_late) {
|
||||||
if (timer->interval_delay != 0) {
|
if (timer->interval_delay != 0) {
|
||||||
// Reschedule the timer with the interval delay
|
// Reschedule the timer with the interval delay
|
||||||
u64 interval_microseconds = timer->interval_delay / 1000;
|
u64 interval_microseconds = timer->interval_delay / 1000;
|
||||||
CoreTiming::ScheduleEvent(usToCycles(interval_microseconds) - cycles_late,
|
CoreTiming::ScheduleEvent(usToCycles(interval_microseconds) - cycles_late,
|
||||||
timer_callback_event_type, timer_handle);
|
timer_callback_event_type, timer_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,7 +151,7 @@ void SendParameter(Service::Interface* self) {
|
||||||
u32 handle = cmd_buff[6];
|
u32 handle = cmd_buff[6];
|
||||||
u32 size = cmd_buff[7];
|
u32 size = cmd_buff[7];
|
||||||
u32 in_param_buffer_ptr = cmd_buff[8];
|
u32 in_param_buffer_ptr = cmd_buff[8];
|
||||||
|
|
||||||
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
||||||
|
|
||||||
LOG_WARNING(Service_APT, "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
|
LOG_WARNING(Service_APT, "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X,"
|
||||||
|
@ -283,7 +283,7 @@ void Init() {
|
||||||
AddService(new APT_A_Interface);
|
AddService(new APT_A_Interface);
|
||||||
AddService(new APT_S_Interface);
|
AddService(new APT_S_Interface);
|
||||||
AddService(new APT_U_Interface);
|
AddService(new APT_U_Interface);
|
||||||
|
|
||||||
// Load the shared system font (if available).
|
// Load the shared system font (if available).
|
||||||
// The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
|
// The expected format is a decrypted, uncompressed BCFNT file with the 0x80 byte header
|
||||||
// generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
|
// generated by the APT:U service. The best way to get is by dumping it from RAM. We've provided
|
||||||
|
|
|
@ -63,7 +63,7 @@ void Initialize(Service::Interface* self);
|
||||||
* 4 : Handle to shared font memory
|
* 4 : Handle to shared font memory
|
||||||
*/
|
*/
|
||||||
void GetSharedFont(Service::Interface* self);
|
void GetSharedFont(Service::Interface* self);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APT::NotifyToWait service function
|
* APT::NotifyToWait service function
|
||||||
* Inputs:
|
* Inputs:
|
||||||
|
@ -88,7 +88,7 @@ void Enable(Service::Interface* self);
|
||||||
* 4 : Home Menu AppId
|
* 4 : Home Menu AppId
|
||||||
* 5 : AppID of currently active app
|
* 5 : AppID of currently active app
|
||||||
*/
|
*/
|
||||||
void GetAppletManInfo(Service::Interface* self);
|
void GetAppletManInfo(Service::Interface* self);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APT::IsRegistered service function. This returns whether the specified AppID is registered with NS yet.
|
* APT::IsRegistered service function. This returns whether the specified AppID is registered with NS yet.
|
||||||
|
@ -100,14 +100,14 @@ void GetAppletManInfo(Service::Interface* self);
|
||||||
* Outputs:
|
* Outputs:
|
||||||
* 0 : Return header
|
* 0 : Return header
|
||||||
* 1 : Result of function, 0 on success, otherwise error code
|
* 1 : Result of function, 0 on success, otherwise error code
|
||||||
* 2 : Output, 0 = not registered, 1 = registered.
|
* 2 : Output, 0 = not registered, 1 = registered.
|
||||||
*/
|
*/
|
||||||
void IsRegistered(Service::Interface* self);
|
void IsRegistered(Service::Interface* self);
|
||||||
|
|
||||||
void InquireNotification(Service::Interface* self);
|
void InquireNotification(Service::Interface* self);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* APT::SendParameter service function. This sets the parameter data state.
|
* APT::SendParameter service function. This sets the parameter data state.
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* 1 : Source AppID
|
* 1 : Source AppID
|
||||||
* 2 : Destination AppID
|
* 2 : Destination AppID
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace BOSS_P {
|
||||||
class Interface : public Service::Interface {
|
class Interface : public Service::Interface {
|
||||||
public:
|
public:
|
||||||
Interface();
|
Interface();
|
||||||
|
|
||||||
std::string GetPortName() const override {
|
std::string GetPortName() const override {
|
||||||
return "boss:P";
|
return "boss:P";
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace BOSS_U {
|
||||||
class Interface : public Service::Interface {
|
class Interface : public Service::Interface {
|
||||||
public:
|
public:
|
||||||
Interface();
|
Interface();
|
||||||
|
|
||||||
std::string GetPortName() const override {
|
std::string GetPortName() const override {
|
||||||
return "boss:U";
|
return "boss:U";
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,5 +19,5 @@ namespace CAM_U {
|
||||||
Interface::Interface() {
|
Interface::Interface() {
|
||||||
//Register(FunctionTable);
|
//Register(FunctionTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -315,11 +315,11 @@ void Init() {
|
||||||
AddService(new CFG_I_Interface);
|
AddService(new CFG_I_Interface);
|
||||||
AddService(new CFG_S_Interface);
|
AddService(new CFG_S_Interface);
|
||||||
AddService(new CFG_U_Interface);
|
AddService(new CFG_U_Interface);
|
||||||
|
|
||||||
// Open the SystemSaveData archive 0x00010017
|
// Open the SystemSaveData archive 0x00010017
|
||||||
FileSys::Path archive_path(cfg_system_savedata_id);
|
FileSys::Path archive_path(cfg_system_savedata_id);
|
||||||
auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SystemSaveData, archive_path);
|
auto archive_result = Service::FS::OpenArchive(Service::FS::ArchiveIdCode::SystemSaveData, archive_path);
|
||||||
|
|
||||||
// If the archive didn't exist, create the files inside
|
// If the archive didn't exist, create the files inside
|
||||||
if (archive_result.Code().description == ErrorDescription::FS_NotFormatted) {
|
if (archive_result.Code().description == ErrorDescription::FS_NotFormatted) {
|
||||||
// Format the archive to create the directories
|
// Format the archive to create the directories
|
||||||
|
|
|
@ -254,7 +254,7 @@ ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archi
|
||||||
|
|
||||||
CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));
|
CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));
|
||||||
|
|
||||||
// This should never even happen in the first place with 64-bit handles,
|
// This should never even happen in the first place with 64-bit handles,
|
||||||
while (handle_map.count(next_handle) != 0) {
|
while (handle_map.count(next_handle) != 0) {
|
||||||
++next_handle;
|
++next_handle;
|
||||||
}
|
}
|
||||||
|
@ -488,7 +488,7 @@ void ArchiveInit() {
|
||||||
RegisterArchiveType(std::move(sdmc_factory), ArchiveIdCode::SDMC);
|
RegisterArchiveType(std::move(sdmc_factory), ArchiveIdCode::SDMC);
|
||||||
else
|
else
|
||||||
LOG_ERROR(Service_FS, "Can't instantiate SDMC archive with path %s", sdmc_directory.c_str());
|
LOG_ERROR(Service_FS, "Can't instantiate SDMC archive with path %s", sdmc_directory.c_str());
|
||||||
|
|
||||||
// Create the SaveData archive
|
// Create the SaveData archive
|
||||||
auto savedata_factory = Common::make_unique<FileSys::ArchiveFactory_SaveData>(sdmc_directory);
|
auto savedata_factory = Common::make_unique<FileSys::ArchiveFactory_SaveData>(sdmc_directory);
|
||||||
RegisterArchiveType(std::move(savedata_factory), ArchiveIdCode::SaveData);
|
RegisterArchiveType(std::move(savedata_factory), ArchiveIdCode::SaveData);
|
||||||
|
@ -503,7 +503,7 @@ void ArchiveInit() {
|
||||||
if (sharedextsavedata_factory->Initialize())
|
if (sharedextsavedata_factory->Initialize())
|
||||||
RegisterArchiveType(std::move(sharedextsavedata_factory), ArchiveIdCode::SharedExtSaveData);
|
RegisterArchiveType(std::move(sharedextsavedata_factory), ArchiveIdCode::SharedExtSaveData);
|
||||||
else
|
else
|
||||||
LOG_ERROR(Service_FS, "Can't instantiate SharedExtSaveData archive with path %s",
|
LOG_ERROR(Service_FS, "Can't instantiate SharedExtSaveData archive with path %s",
|
||||||
sharedextsavedata_factory->GetMountPoint().c_str());
|
sharedextsavedata_factory->GetMountPoint().c_str());
|
||||||
|
|
||||||
// Create the SaveDataCheck archive, basically a small variation of the RomFS archive
|
// Create the SaveDataCheck archive, basically a small variation of the RomFS archive
|
||||||
|
|
|
@ -434,7 +434,7 @@ static void IsSdmcWriteable(Service::Interface* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FS_User::FormatSaveData service function,
|
* FS_User::FormatSaveData service function,
|
||||||
* formats the SaveData specified by the input path.
|
* formats the SaveData specified by the input path.
|
||||||
* Inputs:
|
* Inputs:
|
||||||
* 0 : 0x084C0242
|
* 0 : 0x084C0242
|
||||||
|
@ -520,7 +520,7 @@ static void CreateExtSaveData(Service::Interface* self) {
|
||||||
LOG_WARNING(Service_FS, "(STUBBED) savedata_high=%08X savedata_low=%08X cmd_buff[3]=%08X "
|
LOG_WARNING(Service_FS, "(STUBBED) savedata_high=%08X savedata_low=%08X cmd_buff[3]=%08X "
|
||||||
"cmd_buff[4]=%08X cmd_buff[5]=%08X cmd_buff[6]=%08X cmd_buff[7]=%08X cmd_buff[8]=%08X "
|
"cmd_buff[4]=%08X cmd_buff[5]=%08X cmd_buff[6]=%08X cmd_buff[7]=%08X cmd_buff[8]=%08X "
|
||||||
"cmd_buff[9]=%08X cmd_buff[10]=%08X cmd_buff[11]=%08X", save_high, save_low,
|
"cmd_buff[9]=%08X cmd_buff[10]=%08X cmd_buff[11]=%08X", save_high, save_low,
|
||||||
cmd_buff[3], cmd_buff[4], cmd_buff[5], cmd_buff[6], cmd_buff[7], cmd_buff[8], cmd_buff[9],
|
cmd_buff[3], cmd_buff[4], cmd_buff[5], cmd_buff[6], cmd_buff[7], cmd_buff[8], cmd_buff[9],
|
||||||
cmd_buff[10], cmd_buff[11]);
|
cmd_buff[10], cmd_buff[11]);
|
||||||
|
|
||||||
cmd_buff[1] = CreateExtSaveData(media_type, save_high, save_low).raw;
|
cmd_buff[1] = CreateExtSaveData(media_type, save_high, save_low).raw;
|
||||||
|
@ -544,7 +544,7 @@ static void DeleteExtSaveData(Service::Interface* self) {
|
||||||
u32 save_high = cmd_buff[3];
|
u32 save_high = cmd_buff[3];
|
||||||
u32 unknown = cmd_buff[4]; // TODO(Subv): Figure out what this is
|
u32 unknown = cmd_buff[4]; // TODO(Subv): Figure out what this is
|
||||||
|
|
||||||
LOG_WARNING(Service_FS, "(STUBBED) save_low=%08X save_high=%08X media_type=%08X unknown=%08X",
|
LOG_WARNING(Service_FS, "(STUBBED) save_low=%08X save_high=%08X media_type=%08X unknown=%08X",
|
||||||
save_low, save_high, cmd_buff[1] & 0xFF, unknown);
|
save_low, save_high, cmd_buff[1] & 0xFF, unknown);
|
||||||
|
|
||||||
cmd_buff[1] = DeleteExtSaveData(media_type, save_high, save_low).raw;
|
cmd_buff[1] = DeleteExtSaveData(media_type, save_high, save_low).raw;
|
||||||
|
|
|
@ -167,7 +167,7 @@ static void WriteHWRegsWithMask(Service::Interface* self) {
|
||||||
u32* cmd_buff = Kernel::GetCommandBuffer();
|
u32* cmd_buff = Kernel::GetCommandBuffer();
|
||||||
u32 reg_addr = cmd_buff[1];
|
u32 reg_addr = cmd_buff[1];
|
||||||
u32 size = cmd_buff[2];
|
u32 size = cmd_buff[2];
|
||||||
|
|
||||||
u32* src_data = (u32*)Memory::GetPointer(cmd_buff[4]);
|
u32* src_data = (u32*)Memory::GetPointer(cmd_buff[4]);
|
||||||
u32* mask_data = (u32*)Memory::GetPointer(cmd_buff[6]);
|
u32* mask_data = (u32*)Memory::GetPointer(cmd_buff[6]);
|
||||||
|
|
||||||
|
@ -208,21 +208,21 @@ static void SetBufferSwap(u32 screen_id, const FrameBufferInfo& info) {
|
||||||
PAddr phys_address_left = Memory::VirtualToPhysicalAddress(info.address_left);
|
PAddr phys_address_left = Memory::VirtualToPhysicalAddress(info.address_left);
|
||||||
PAddr phys_address_right = Memory::VirtualToPhysicalAddress(info.address_right);
|
PAddr phys_address_right = Memory::VirtualToPhysicalAddress(info.address_right);
|
||||||
if (info.active_fb == 0) {
|
if (info.active_fb == 0) {
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_left1)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_left1)), 4,
|
||||||
&phys_address_left);
|
&phys_address_left);
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_right1)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_right1)), 4,
|
||||||
&phys_address_right);
|
&phys_address_right);
|
||||||
} else {
|
} else {
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_left2)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_left2)), 4,
|
||||||
&phys_address_left);
|
&phys_address_left);
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_right2)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].address_right2)), 4,
|
||||||
&phys_address_right);
|
&phys_address_right);
|
||||||
}
|
}
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].stride)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].stride)), 4,
|
||||||
&info.stride);
|
&info.stride);
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].color_format)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].color_format)), 4,
|
||||||
&info.format);
|
&info.format);
|
||||||
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].active_fb)), 4,
|
WriteHWRegs(base_address + 4 * static_cast<u32>(GPU_REG_INDEX(framebuffer_config[screen_id].active_fb)), 4,
|
||||||
&info.shown_fb);
|
&info.shown_fb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -374,7 +374,7 @@ static void ExecuteCommand(const Command& command, u32 thread_id) {
|
||||||
{
|
{
|
||||||
auto& params = command.set_command_list_last;
|
auto& params = command.set_command_list_last;
|
||||||
|
|
||||||
WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(command_processor_config.address)),
|
WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(command_processor_config.address)),
|
||||||
Memory::VirtualToPhysicalAddress(params.address) >> 3);
|
Memory::VirtualToPhysicalAddress(params.address) >> 3);
|
||||||
WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(command_processor_config.size)), params.size);
|
WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(command_processor_config.size)), params.size);
|
||||||
|
|
||||||
|
@ -470,7 +470,7 @@ static void SetLcdForceBlack(Service::Interface* self) {
|
||||||
|
|
||||||
LCD::Write(HW::VADDR_LCD + 4 * LCD_REG_INDEX(color_fill_top), data.raw); // Top LCD
|
LCD::Write(HW::VADDR_LCD + 4 * LCD_REG_INDEX(color_fill_top), data.raw); // Top LCD
|
||||||
LCD::Write(HW::VADDR_LCD + 4 * LCD_REG_INDEX(color_fill_bottom), data.raw); // Bottom LCD
|
LCD::Write(HW::VADDR_LCD + 4 * LCD_REG_INDEX(color_fill_bottom), data.raw); // Bottom LCD
|
||||||
|
|
||||||
cmd_buff[1] = RESULT_SUCCESS.raw;
|
cmd_buff[1] = RESULT_SUCCESS.raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -516,8 +516,8 @@ static void TriggerCmdReqQueue(Service::Interface* self) {
|
||||||
*/
|
*/
|
||||||
static void ImportDisplayCaptureInfo(Service::Interface* self) {
|
static void ImportDisplayCaptureInfo(Service::Interface* self) {
|
||||||
u32* cmd_buff = Kernel::GetCommandBuffer();
|
u32* cmd_buff = Kernel::GetCommandBuffer();
|
||||||
|
|
||||||
// TODO(Subv): We're always returning the framebuffer structures for thread_id = 0,
|
// TODO(Subv): We're always returning the framebuffer structures for thread_id = 0,
|
||||||
// because we only support a single running application at a time.
|
// because we only support a single running application at a time.
|
||||||
// This should always return the framebuffer data that is currently displayed on the screen.
|
// This should always return the framebuffer data that is currently displayed on the screen.
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ void Update() {
|
||||||
mem->touch.index_reset_ticks_previous = mem->touch.index_reset_ticks;
|
mem->touch.index_reset_ticks_previous = mem->touch.index_reset_ticks;
|
||||||
mem->touch.index_reset_ticks = (s64)CoreTiming::GetTicks();
|
mem->touch.index_reset_ticks = (s64)CoreTiming::GetTicks();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signal both handles when there's an update to Pad or touch
|
// Signal both handles when there's an update to Pad or touch
|
||||||
event_pad_or_touch_1->Signal();
|
event_pad_or_touch_1->Signal();
|
||||||
event_pad_or_touch_2->Signal();
|
event_pad_or_touch_2->Signal();
|
||||||
|
|
|
@ -25,6 +25,6 @@ const Interface::FunctionInfo FunctionTable[] = {
|
||||||
HID_SPVR_Interface::HID_SPVR_Interface() {
|
HID_SPVR_Interface::HID_SPVR_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace HID
|
} // namespace HID
|
||||||
} // namespace Service
|
} // namespace Service
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
namespace Service {
|
namespace Service {
|
||||||
namespace HID {
|
namespace HID {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HID service interface.
|
* HID service interface.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -20,15 +20,15 @@ enum class ChargeLevels : u32 {
|
||||||
CompletelyFull = 5,
|
CompletelyFull = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the gamecoin file structure in the SharedExtData archive
|
* Represents the gamecoin file structure in the SharedExtData archive
|
||||||
* More information in 3dbrew (http://www.3dbrew.org/wiki/Extdata#Shared_Extdata_0xf000000b_gamecoin.dat)
|
* More information in 3dbrew (http://www.3dbrew.org/wiki/Extdata#Shared_Extdata_0xf000000b_gamecoin.dat)
|
||||||
*/
|
*/
|
||||||
struct GameCoin {
|
struct GameCoin {
|
||||||
u32 magic; ///< Magic number: 0x4F00
|
u32 magic; ///< Magic number: 0x4F00
|
||||||
u16 total_coins; ///< Total Play Coins
|
u16 total_coins; ///< Total Play Coins
|
||||||
u16 total_coins_on_date; ///< Total Play Coins obtained on the date stored below.
|
u16 total_coins_on_date; ///< Total Play Coins obtained on the date stored below.
|
||||||
u32 step_count; ///< Total step count at the time a new Play Coin was obtained.
|
u32 step_count; ///< Total step count at the time a new Play Coin was obtained.
|
||||||
u32 last_step_count; ///< Step count for the day the last Play Coin was obtained
|
u32 last_step_count; ///< Step count for the day the last Play Coin was obtained
|
||||||
u16 year;
|
u16 year;
|
||||||
u8 month;
|
u8 month;
|
||||||
|
|
|
@ -18,6 +18,6 @@ const Interface::FunctionInfo FunctionTable[] = {
|
||||||
PTM_Play_Interface::PTM_Play_Interface() {
|
PTM_Play_Interface::PTM_Play_Interface() {
|
||||||
Register(FunctionTable);
|
Register(FunctionTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace PTM
|
} // namespace PTM
|
||||||
} // namespace Service
|
} // namespace Service
|
|
@ -52,7 +52,7 @@ std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_kernel_named_por
|
||||||
std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services;
|
std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a function string for logging, complete with the name (or header code, depending
|
* Creates a function string for logging, complete with the name (or header code, depending
|
||||||
* on what's passed in) the port name, and all the cmd_buff arguments.
|
* on what's passed in) the port name, and all the cmd_buff arguments.
|
||||||
*/
|
*/
|
||||||
static std::string MakeFunctionString(const char* name, const char* port_name, const u32* cmd_buff) {
|
static std::string MakeFunctionString(const char* name, const char* port_name, const u32* cmd_buff) {
|
||||||
|
|
|
@ -139,7 +139,7 @@ static int TranslateError(int error) {
|
||||||
auto found = error_map.find(error);
|
auto found = error_map.find(error);
|
||||||
if (found != error_map.end())
|
if (found != error_map.end())
|
||||||
return -found->second;
|
return -found->second;
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +346,7 @@ static void Bind(Service::Interface* self) {
|
||||||
sockaddr sock_addr = CTRSockAddr::ToPlatform(*ctr_sock_addr);
|
sockaddr sock_addr = CTRSockAddr::ToPlatform(*ctr_sock_addr);
|
||||||
|
|
||||||
int res = ::bind(socket_handle, &sock_addr, std::max<u32>(sizeof(sock_addr), len));
|
int res = ::bind(socket_handle, &sock_addr, std::max<u32>(sizeof(sock_addr), len));
|
||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
result = TranslateError(GET_ERRNO);
|
result = TranslateError(GET_ERRNO);
|
||||||
|
@ -360,14 +360,14 @@ static void Fcntl(Service::Interface* self) {
|
||||||
u32 socket_handle = cmd_buffer[1];
|
u32 socket_handle = cmd_buffer[1];
|
||||||
u32 ctr_cmd = cmd_buffer[2];
|
u32 ctr_cmd = cmd_buffer[2];
|
||||||
u32 ctr_arg = cmd_buffer[3];
|
u32 ctr_arg = cmd_buffer[3];
|
||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
u32 posix_ret = 0; // TODO: Check what hardware returns for F_SETFL (unspecified by POSIX)
|
u32 posix_ret = 0; // TODO: Check what hardware returns for F_SETFL (unspecified by POSIX)
|
||||||
SCOPE_EXIT({
|
SCOPE_EXIT({
|
||||||
cmd_buffer[1] = result;
|
cmd_buffer[1] = result;
|
||||||
cmd_buffer[2] = posix_ret;
|
cmd_buffer[2] = posix_ret;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (ctr_cmd == 3) { // F_GETFL
|
if (ctr_cmd == 3) { // F_GETFL
|
||||||
#if EMU_PLATFORM == PLATFORM_WINDOWS
|
#if EMU_PLATFORM == PLATFORM_WINDOWS
|
||||||
posix_ret = 0;
|
posix_ret = 0;
|
||||||
|
@ -404,11 +404,11 @@ static void Fcntl(Service::Interface* self) {
|
||||||
posix_ret = -1;
|
posix_ret = -1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags &= ~O_NONBLOCK;
|
flags &= ~O_NONBLOCK;
|
||||||
if (ctr_arg & 4) // O_NONBLOCK
|
if (ctr_arg & 4) // O_NONBLOCK
|
||||||
flags |= O_NONBLOCK;
|
flags |= O_NONBLOCK;
|
||||||
|
|
||||||
int ret = ::fcntl(socket_handle, F_SETFL, flags);
|
int ret = ::fcntl(socket_handle, F_SETFL, flags);
|
||||||
if (ret == SOCKET_ERROR_VALUE) {
|
if (ret == SOCKET_ERROR_VALUE) {
|
||||||
result = TranslateError(GET_ERRNO);
|
result = TranslateError(GET_ERRNO);
|
||||||
|
@ -439,8 +439,8 @@ static void Listen(Service::Interface* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Accept(Service::Interface* self) {
|
static void Accept(Service::Interface* self) {
|
||||||
// TODO(Subv): Calling this function on a blocking socket will block the emu thread,
|
// TODO(Subv): Calling this function on a blocking socket will block the emu thread,
|
||||||
// preventing graceful shutdown when closing the emulator, this can be fixed by always
|
// preventing graceful shutdown when closing the emulator, this can be fixed by always
|
||||||
// performing nonblocking operations and spinlock until the data is available
|
// performing nonblocking operations and spinlock until the data is available
|
||||||
u32* cmd_buffer = Kernel::GetCommandBuffer();
|
u32* cmd_buffer = Kernel::GetCommandBuffer();
|
||||||
u32 socket_handle = cmd_buffer[1];
|
u32 socket_handle = cmd_buffer[1];
|
||||||
|
@ -448,7 +448,7 @@ static void Accept(Service::Interface* self) {
|
||||||
sockaddr addr;
|
sockaddr addr;
|
||||||
socklen_t addr_len = sizeof(addr);
|
socklen_t addr_len = sizeof(addr);
|
||||||
u32 ret = static_cast<u32>(::accept(socket_handle, &addr, &addr_len));
|
u32 ret = static_cast<u32>(::accept(socket_handle, &addr, &addr_len));
|
||||||
|
|
||||||
if ((s32)ret != SOCKET_ERROR_VALUE)
|
if ((s32)ret != SOCKET_ERROR_VALUE)
|
||||||
open_sockets[ret] = { ret, true };
|
open_sockets[ret] = { ret, true };
|
||||||
|
|
||||||
|
@ -525,8 +525,8 @@ static void SendTo(Service::Interface* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RecvFrom(Service::Interface* self) {
|
static void RecvFrom(Service::Interface* self) {
|
||||||
// TODO(Subv): Calling this function on a blocking socket will block the emu thread,
|
// TODO(Subv): Calling this function on a blocking socket will block the emu thread,
|
||||||
// preventing graceful shutdown when closing the emulator, this can be fixed by always
|
// preventing graceful shutdown when closing the emulator, this can be fixed by always
|
||||||
// performing nonblocking operations and spinlock until the data is available
|
// performing nonblocking operations and spinlock until the data is available
|
||||||
u32* cmd_buffer = Kernel::GetCommandBuffer();
|
u32* cmd_buffer = Kernel::GetCommandBuffer();
|
||||||
u32 socket_handle = cmd_buffer[1];
|
u32 socket_handle = cmd_buffer[1];
|
||||||
|
@ -568,7 +568,7 @@ static void Poll(Service::Interface* self) {
|
||||||
pollfd* platform_pollfd = new pollfd[nfds];
|
pollfd* platform_pollfd = new pollfd[nfds];
|
||||||
for (unsigned current_fds = 0; current_fds < nfds; ++current_fds)
|
for (unsigned current_fds = 0; current_fds < nfds; ++current_fds)
|
||||||
platform_pollfd[current_fds] = CTRPollFD::ToPlatform(input_fds[current_fds]);
|
platform_pollfd[current_fds] = CTRPollFD::ToPlatform(input_fds[current_fds]);
|
||||||
|
|
||||||
int ret = ::poll(platform_pollfd, nfds, timeout);
|
int ret = ::poll(platform_pollfd, nfds, timeout);
|
||||||
|
|
||||||
// Now update the output pollfd structure
|
// Now update the output pollfd structure
|
||||||
|
@ -630,7 +630,7 @@ static void GetPeerName(Service::Interface* self) {
|
||||||
socklen_t len = cmd_buffer[2];
|
socklen_t len = cmd_buffer[2];
|
||||||
|
|
||||||
CTRSockAddr* ctr_dest_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[0x104 >> 2]));
|
CTRSockAddr* ctr_dest_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[0x104 >> 2]));
|
||||||
|
|
||||||
sockaddr dest_addr;
|
sockaddr dest_addr;
|
||||||
socklen_t dest_addr_len = sizeof(dest_addr);
|
socklen_t dest_addr_len = sizeof(dest_addr);
|
||||||
int ret = ::getpeername(socket_handle, &dest_addr, &dest_addr_len);
|
int ret = ::getpeername(socket_handle, &dest_addr, &dest_addr_len);
|
||||||
|
@ -651,8 +651,8 @@ static void GetPeerName(Service::Interface* self) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Connect(Service::Interface* self) {
|
static void Connect(Service::Interface* self) {
|
||||||
// TODO(Subv): Calling this function on a blocking socket will block the emu thread,
|
// TODO(Subv): Calling this function on a blocking socket will block the emu thread,
|
||||||
// preventing graceful shutdown when closing the emulator, this can be fixed by always
|
// preventing graceful shutdown when closing the emulator, this can be fixed by always
|
||||||
// performing nonblocking operations and spinlock until the data is available
|
// performing nonblocking operations and spinlock until the data is available
|
||||||
u32* cmd_buffer = Kernel::GetCommandBuffer();
|
u32* cmd_buffer = Kernel::GetCommandBuffer();
|
||||||
u32 socket_handle = cmd_buffer[1];
|
u32 socket_handle = cmd_buffer[1];
|
||||||
|
|
|
@ -228,7 +228,7 @@ static ResultCode WaitSynchronizationN(s32* out, Handle* handles, s32 handle_cou
|
||||||
// Actually wait the current thread on each object if we decided to wait...
|
// Actually wait the current thread on each object if we decided to wait...
|
||||||
std::vector<SharedPtr<Kernel::WaitObject>> wait_objects;
|
std::vector<SharedPtr<Kernel::WaitObject>> wait_objects;
|
||||||
wait_objects.reserve(handle_count);
|
wait_objects.reserve(handle_count);
|
||||||
|
|
||||||
for (int i = 0; i < handle_count; ++i) {
|
for (int i = 0; i < handle_count; ++i) {
|
||||||
auto object = Kernel::g_handle_table.GetWaitObject(handles[i]);
|
auto object = Kernel::g_handle_table.GetWaitObject(handles[i]);
|
||||||
object->AddWaitingThread(Kernel::GetCurrentThread());
|
object->AddWaitingThread(Kernel::GetCurrentThread());
|
||||||
|
@ -475,7 +475,7 @@ static ResultCode GetProcessIdOfThread(u32* process_id, Handle thread_handle) {
|
||||||
return ERR_INVALID_HANDLE;
|
return ERR_INVALID_HANDLE;
|
||||||
|
|
||||||
const SharedPtr<Kernel::Process> process = thread->owner_process;
|
const SharedPtr<Kernel::Process> process = thread->owner_process;
|
||||||
|
|
||||||
ASSERT_MSG(process != nullptr, "Invalid parent process for thread=0x%08X", thread_handle);
|
ASSERT_MSG(process != nullptr, "Invalid parent process for thread=0x%08X", thread_handle);
|
||||||
|
|
||||||
*process_id = process->process_id;
|
*process_id = process->process_id;
|
||||||
|
|
|
@ -140,7 +140,7 @@ inline void Write(u32 addr, const T data) {
|
||||||
// Raw copies do not perform color conversion nor tiled->linear / linear->tiled conversions
|
// Raw copies do not perform color conversion nor tiled->linear / linear->tiled conversions
|
||||||
// TODO(Subv): Verify if raw copies perform scaling
|
// TODO(Subv): Verify if raw copies perform scaling
|
||||||
memcpy(dst_pointer, src_pointer, output_size);
|
memcpy(dst_pointer, src_pointer, output_size);
|
||||||
|
|
||||||
LOG_TRACE(HW_GPU, "DisplayTriggerTransfer: 0x%08x bytes from 0x%08x(%ux%u)-> 0x%08x(%ux%u), output format: %x, flags 0x%08X, Raw copy",
|
LOG_TRACE(HW_GPU, "DisplayTriggerTransfer: 0x%08x bytes from 0x%08x(%ux%u)-> 0x%08x(%ux%u), output format: %x, flags 0x%08X, Raw copy",
|
||||||
output_size,
|
output_size,
|
||||||
config.GetPhysicalInputAddress(), config.input_width.Value(), config.input_height.Value(),
|
config.GetPhysicalInputAddress(), config.input_width.Value(), config.input_height.Value(),
|
||||||
|
@ -159,14 +159,14 @@ inline void Write(u32 addr, const T data) {
|
||||||
for (u32 x = 0; x < output_width; ++x) {
|
for (u32 x = 0; x < output_width; ++x) {
|
||||||
Math::Vec4<u8> src_color = { 0, 0, 0, 0 };
|
Math::Vec4<u8> src_color = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
// Calculate the [x,y] position of the input image
|
// Calculate the [x,y] position of the input image
|
||||||
// based on the current output position and the scale
|
// based on the current output position and the scale
|
||||||
u32 input_x = x * horizontal_scale;
|
u32 input_x = x * horizontal_scale;
|
||||||
u32 input_y = y * vertical_scale;
|
u32 input_y = y * vertical_scale;
|
||||||
|
|
||||||
if (config.flip_vertically) {
|
if (config.flip_vertically) {
|
||||||
// Flip the y value of the output data,
|
// Flip the y value of the output data,
|
||||||
// we do this after calculating the [x,y] position of the input image
|
// we do this after calculating the [x,y] position of the input image
|
||||||
// to account for the scaling options.
|
// to account for the scaling options.
|
||||||
y = output_height - y - 1;
|
y = output_height - y - 1;
|
||||||
}
|
}
|
||||||
|
@ -302,7 +302,7 @@ static void VBlankCallback(u64 userdata, int cycles_late) {
|
||||||
// - If frameskip == 0 (disabled), always swap buffers
|
// - If frameskip == 0 (disabled), always swap buffers
|
||||||
// - If frameskip == 1, swap buffers every other frame (starting from the first frame)
|
// - If frameskip == 1, swap buffers every other frame (starting from the first frame)
|
||||||
// - If frameskip > 1, swap buffers every frameskip^n frames (starting from the second frame)
|
// - If frameskip > 1, swap buffers every frameskip^n frames (starting from the second frame)
|
||||||
if ((((Settings::values.frame_skip != 1) ^ last_skip_frame) && last_skip_frame != g_skip_frame) ||
|
if ((((Settings::values.frame_skip != 1) ^ last_skip_frame) && last_skip_frame != g_skip_frame) ||
|
||||||
Settings::values.frame_skip == 0) {
|
Settings::values.frame_skip == 0) {
|
||||||
VideoCore::g_renderer->SwapBuffers();
|
VideoCore::g_renderer->SwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,5 +66,5 @@ void Init() {
|
||||||
void Shutdown() {
|
void Shutdown() {
|
||||||
LOG_DEBUG(HW_LCD, "shutdown OK");
|
LOG_DEBUG(HW_LCD, "shutdown OK");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -85,5 +85,5 @@ void Init();
|
||||||
|
|
||||||
/// Shutdown hardware
|
/// Shutdown hardware
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -234,7 +234,7 @@ ResultStatus AppLoader_THREEDSX::Load() {
|
||||||
Kernel::g_current_process = Kernel::Process::Create(filename, 0);
|
Kernel::g_current_process = Kernel::Process::Create(filename, 0);
|
||||||
Kernel::g_current_process->svc_access_mask.set();
|
Kernel::g_current_process->svc_access_mask.set();
|
||||||
Kernel::g_current_process->address_mappings = default_address_mappings;
|
Kernel::g_current_process->address_mappings = default_address_mappings;
|
||||||
|
|
||||||
// Attach the default resource limit (APPLICATION) to the process
|
// Attach the default resource limit (APPLICATION) to the process
|
||||||
Kernel::g_current_process->resource_limit = Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
|
Kernel::g_current_process->resource_limit = Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION);
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ enum : VAddr {
|
||||||
SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE,
|
SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE,
|
||||||
|
|
||||||
// TODO(yuriks): The size of this area is dynamic, the kernel grows
|
// TODO(yuriks): The size of this area is dynamic, the kernel grows
|
||||||
// it as more and more threads are created. For now we'll just use a
|
// it as more and more threads are created. For now we'll just use a
|
||||||
// hardcoded value.
|
// hardcoded value.
|
||||||
/// Area where TLS (Thread-Local Storage) buffers are allocated.
|
/// Area where TLS (Thread-Local Storage) buffers are allocated.
|
||||||
TLS_AREA_VADDR = 0x1FF82000,
|
TLS_AREA_VADDR = 0x1FF82000,
|
||||||
|
|
|
@ -136,7 +136,7 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
input.attr[i][0].ToFloat32(), input.attr[i][1].ToFloat32(),
|
input.attr[i][0].ToFloat32(), input.attr[i][1].ToFloat32(),
|
||||||
input.attr[i][2].ToFloat32(), input.attr[i][3].ToFloat32());
|
input.attr[i][2].ToFloat32(), input.attr[i][3].ToFloat32());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load per-vertex data from the loader arrays
|
// Load per-vertex data from the loader arrays
|
||||||
for (unsigned int comp = 0; comp < vertex_attribute_elements[i]; ++comp) {
|
for (unsigned int comp = 0; comp < vertex_attribute_elements[i]; ++comp) {
|
||||||
const u8* srcdata = Memory::GetPhysicalPointer(vertex_attribute_sources[i] + vertex_attribute_strides[i] * vertex + comp * vertex_attribute_element_size[i]);
|
const u8* srcdata = Memory::GetPhysicalPointer(vertex_attribute_sources[i] + vertex_attribute_strides[i] * vertex + comp * vertex_attribute_element_size[i]);
|
||||||
|
@ -193,7 +193,7 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
const Pica::VertexShader::OutputVertex& v2) {
|
const Pica::VertexShader::OutputVertex& v2) {
|
||||||
VideoCore::g_renderer->hw_rasterizer->AddTriangle(v0, v1, v2);
|
VideoCore::g_renderer->hw_rasterizer->AddTriangle(v0, v1, v2);
|
||||||
};
|
};
|
||||||
|
|
||||||
primitive_assembler.SubmitVertex(output, AddHWTriangle);
|
primitive_assembler.SubmitVertex(output, AddHWTriangle);
|
||||||
} else {
|
} else {
|
||||||
// Send to triangle clipper
|
// Send to triangle clipper
|
||||||
|
@ -282,7 +282,7 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load default vertex input attributes
|
// Load default vertex input attributes
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_default_attributes_setup.set_value[0], 0x233):
|
case PICA_REG_INDEX_WORKAROUND(vs_default_attributes_setup.set_value[0], 0x233):
|
||||||
case PICA_REG_INDEX_WORKAROUND(vs_default_attributes_setup.set_value[1], 0x234):
|
case PICA_REG_INDEX_WORKAROUND(vs_default_attributes_setup.set_value[1], 0x234):
|
||||||
|
@ -306,7 +306,7 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Math::Vec4<float24>& attribute = g_state.vs.default_attributes[setup.index];
|
Math::Vec4<float24>& attribute = g_state.vs.default_attributes[setup.index];
|
||||||
|
|
||||||
// NOTE: The destination component order indeed is "backwards"
|
// NOTE: The destination component order indeed is "backwards"
|
||||||
attribute.w = float24::FromRawFloat24(default_attr_write_buffer[0] >> 8);
|
attribute.w = float24::FromRawFloat24(default_attr_write_buffer[0] >> 8);
|
||||||
attribute.z = float24::FromRawFloat24(((default_attr_write_buffer[0] & 0xFF) << 16) | ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
|
attribute.z = float24::FromRawFloat24(((default_attr_write_buffer[0] & 0xFF) << 16) | ((default_attr_write_buffer[1] >> 16) & 0xFFFF));
|
||||||
|
|
|
@ -319,7 +319,7 @@ const Math::Vec4<u8> LookupTexture(const u8* source, int x, int y, const Texture
|
||||||
// TODO(neobrain): Fix code design to unify vertical block offsets!
|
// TODO(neobrain): Fix code design to unify vertical block offsets!
|
||||||
source += coarse_y * info.stride;
|
source += coarse_y * info.stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Assert that width/height are multiples of block dimensions
|
// TODO: Assert that width/height are multiples of block dimensions
|
||||||
|
|
||||||
switch (info.format) {
|
switch (info.format) {
|
||||||
|
|
|
@ -461,7 +461,7 @@ public:
|
||||||
// e.g. Vec2 uv() { return Vec2(x,y); }
|
// e.g. Vec2 uv() { return Vec2(x,y); }
|
||||||
|
|
||||||
// _DEFINE_SWIZZLER2 defines a single such function
|
// _DEFINE_SWIZZLER2 defines a single such function
|
||||||
// DEFINE_SWIZZLER2_COMP1 defines one-component functions for all component names (x<->r)
|
// DEFINE_SWIZZLER2_COMP1 defines one-component functions for all component names (x<->r)
|
||||||
// DEFINE_SWIZZLER2_COMP2 defines two component functions for all component names (x<->r) and permutations (xy<->yx)
|
// DEFINE_SWIZZLER2_COMP2 defines two component functions for all component names (x<->r) and permutations (xy<->yx)
|
||||||
#define _DEFINE_SWIZZLER2(a, b, name) const Vec2<T> name() const { return Vec2<T>(a, b); }
|
#define _DEFINE_SWIZZLER2(a, b, name) const Vec2<T> name() const { return Vec2<T>(a, b); }
|
||||||
#define DEFINE_SWIZZLER2_COMP1(a, a2) \
|
#define DEFINE_SWIZZLER2_COMP1(a, a2) \
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
namespace Pica {
|
namespace Pica {
|
||||||
|
|
||||||
|
@ -337,7 +337,7 @@ struct Regs {
|
||||||
return (stage_index < 4) && (update_mask_a & (1 << stage_index));
|
return (stage_index < 4) && (update_mask_a & (1 << stage_index));
|
||||||
}
|
}
|
||||||
} tev_combiner_buffer_input;
|
} tev_combiner_buffer_input;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0xf);
|
INSERT_PADDING_WORDS(0xf);
|
||||||
TevStageConfig tev_stage4;
|
TevStageConfig tev_stage4;
|
||||||
INSERT_PADDING_WORDS(0x3);
|
INSERT_PADDING_WORDS(0x3);
|
||||||
|
@ -703,11 +703,11 @@ struct Regs {
|
||||||
struct {
|
struct {
|
||||||
// Index of the current default attribute
|
// Index of the current default attribute
|
||||||
u32 index;
|
u32 index;
|
||||||
|
|
||||||
// Writing to these registers sets the "current" default attribute.
|
// Writing to these registers sets the "current" default attribute.
|
||||||
u32 set_value[3];
|
u32 set_value[3];
|
||||||
} vs_default_attributes_setup;
|
} vs_default_attributes_setup;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x28);
|
INSERT_PADDING_WORDS(0x28);
|
||||||
|
|
||||||
enum class TriangleTopology : u32 {
|
enum class TriangleTopology : u32 {
|
||||||
|
|
|
@ -104,7 +104,7 @@ static u32 GetDepth(int x, int y) {
|
||||||
u8* depth_buffer = Memory::GetPhysicalPointer(addr);
|
u8* depth_buffer = Memory::GetPhysicalPointer(addr);
|
||||||
|
|
||||||
y = framebuffer.height - y;
|
y = framebuffer.height - y;
|
||||||
|
|
||||||
const u32 coarse_y = y & ~7;
|
const u32 coarse_y = y & ~7;
|
||||||
u32 bytes_per_pixel = Regs::BytesPerDepthPixel(framebuffer.depth_format);
|
u32 bytes_per_pixel = Regs::BytesPerDepthPixel(framebuffer.depth_format);
|
||||||
u32 stride = framebuffer.width * bytes_per_pixel;
|
u32 stride = framebuffer.width * bytes_per_pixel;
|
||||||
|
|
|
@ -62,9 +62,9 @@ static int TestPointer(const PROC pTest)
|
||||||
ptrdiff_t iTest;
|
ptrdiff_t iTest;
|
||||||
if(!pTest) return 0;
|
if(!pTest) return 0;
|
||||||
iTest = (ptrdiff_t)pTest;
|
iTest = (ptrdiff_t)pTest;
|
||||||
|
|
||||||
if(iTest == 1 || iTest == 2 || iTest == 3 || iTest == -1) return 0;
|
if(iTest == 1 || iTest == 2 || iTest == 3 || iTest == -1) return 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ static PROC WinGetProcAddress(const char *name)
|
||||||
glMod = GetModuleHandleA("OpenGL32.dll");
|
glMod = GetModuleHandleA("OpenGL32.dll");
|
||||||
return (PROC)GetProcAddress(glMod, (LPCSTR)name);
|
return (PROC)GetProcAddress(glMod, (LPCSTR)name);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IntGetProcAddress(name) WinGetProcAddress(name)
|
#define IntGetProcAddress(name) WinGetProcAddress(name)
|
||||||
#else
|
#else
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
|
@ -1083,7 +1083,7 @@ static ogl_StrToExtMap *FindExtEntry(const char *extensionName)
|
||||||
if(strcmp(extensionName, currLoc->extensionName) == 0)
|
if(strcmp(extensionName, currLoc->extensionName) == 0)
|
||||||
return currLoc;
|
return currLoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1135,15 +1135,15 @@ int ogl_LoadFunctions()
|
||||||
{
|
{
|
||||||
int numFailed = 0;
|
int numFailed = 0;
|
||||||
ClearExtensionVars();
|
ClearExtensionVars();
|
||||||
|
|
||||||
_ptrc_glGetIntegerv = (void (CODEGEN_FUNCPTR *)(GLenum, GLint *))IntGetProcAddress("glGetIntegerv");
|
_ptrc_glGetIntegerv = (void (CODEGEN_FUNCPTR *)(GLenum, GLint *))IntGetProcAddress("glGetIntegerv");
|
||||||
if(!_ptrc_glGetIntegerv) return ogl_LOAD_FAILED;
|
if(!_ptrc_glGetIntegerv) return ogl_LOAD_FAILED;
|
||||||
_ptrc_glGetStringi = (const GLubyte * (CODEGEN_FUNCPTR *)(GLenum, GLuint))IntGetProcAddress("glGetStringi");
|
_ptrc_glGetStringi = (const GLubyte * (CODEGEN_FUNCPTR *)(GLenum, GLuint))IntGetProcAddress("glGetStringi");
|
||||||
if(!_ptrc_glGetStringi) return ogl_LOAD_FAILED;
|
if(!_ptrc_glGetStringi) return ogl_LOAD_FAILED;
|
||||||
|
|
||||||
ProcExtsFromExtList();
|
ProcExtsFromExtList();
|
||||||
numFailed = Load_Version_3_2();
|
numFailed = Load_Version_3_2();
|
||||||
|
|
||||||
if(numFailed == 0)
|
if(numFailed == 0)
|
||||||
return ogl_LOAD_SUCCEEDED;
|
return ogl_LOAD_SUCCEEDED;
|
||||||
else
|
else
|
||||||
|
@ -1177,7 +1177,7 @@ int ogl_IsVersionGEQ(int majorVersion, int minorVersion)
|
||||||
{
|
{
|
||||||
if(g_major_version == 0)
|
if(g_major_version == 0)
|
||||||
GetGLVersion();
|
GetGLVersion();
|
||||||
|
|
||||||
if(majorVersion > g_major_version) return 1;
|
if(majorVersion > g_major_version) return 1;
|
||||||
if(majorVersion < g_major_version) return 0;
|
if(majorVersion < g_major_version) return 0;
|
||||||
if(minorVersion >= g_minor_version) return 1;
|
if(minorVersion >= g_minor_version) return 1;
|
||||||
|
|
|
@ -350,7 +350,7 @@ void RasterizerOpenGL::NotifyPicaRegisterChanged(u32 id) {
|
||||||
case PICA_REG_INDEX(tev_stage5.color_scale):
|
case PICA_REG_INDEX(tev_stage5.color_scale):
|
||||||
SyncTevMultipliers(5, regs.tev_stage5);
|
SyncTevMultipliers(5, regs.tev_stage5);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// TEV combiner buffer color
|
// TEV combiner buffer color
|
||||||
case PICA_REG_INDEX(tev_combiner_buffer_color):
|
case PICA_REG_INDEX(tev_combiner_buffer_color):
|
||||||
SyncCombinerColor();
|
SyncCombinerColor();
|
||||||
|
|
|
@ -82,7 +82,7 @@ void OpenGLState::Apply() {
|
||||||
} else {
|
} else {
|
||||||
glDisable(GL_STENCIL_TEST);
|
glDisable(GL_STENCIL_TEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stencil.test_func != cur_state.stencil.test_func ||
|
if (stencil.test_func != cur_state.stencil.test_func ||
|
||||||
stencil.test_ref != cur_state.stencil.test_ref ||
|
stencil.test_ref != cur_state.stencil.test_ref ||
|
||||||
|
|
|
@ -61,7 +61,7 @@ public:
|
||||||
static const OpenGLState& GetCurState() {
|
static const OpenGLState& GetCurState() {
|
||||||
return cur_state;
|
return cur_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply this state as the current OpenGL state
|
/// Apply this state as the current OpenGL state
|
||||||
void Apply();
|
void Apply();
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ void RendererOpenGL::LoadFBToActiveGLTexture(const GPU::Regs::FramebufferConfig&
|
||||||
state.texture_units[0].enabled_2d = true;
|
state.texture_units[0].enabled_2d = true;
|
||||||
state.texture_units[0].texture_2d = texture.handle;
|
state.texture_units[0].texture_2d = texture.handle;
|
||||||
state.Apply();
|
state.Apply();
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, (GLint)pixel_stride);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, (GLint)pixel_stride);
|
||||||
|
|
||||||
|
|
|
@ -330,7 +330,7 @@ static void ProcessShaderCode(VertexShaderState& state) {
|
||||||
|
|
||||||
case OpCode::Type::MultiplyAdd:
|
case OpCode::Type::MultiplyAdd:
|
||||||
{
|
{
|
||||||
if ((instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD) ||
|
if ((instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MAD) ||
|
||||||
(instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI)) {
|
(instr.opcode.Value().EffectiveOpCode() == OpCode::Id::MADI)) {
|
||||||
const SwizzlePattern& swizzle = *(SwizzlePattern*)&swizzle_data[instr.mad.operand_desc_id];
|
const SwizzlePattern& swizzle = *(SwizzlePattern*)&swizzle_data[instr.mad.operand_desc_id];
|
||||||
|
|
||||||
|
@ -547,7 +547,7 @@ OutputVertex RunShader(const InputVertex& input, int num_attributes) {
|
||||||
const auto& attribute_register_map = regs.vs_input_register_map;
|
const auto& attribute_register_map = regs.vs_input_register_map;
|
||||||
float24 dummy_register;
|
float24 dummy_register;
|
||||||
boost::fill(state.input_register_table, &dummy_register);
|
boost::fill(state.input_register_table, &dummy_register);
|
||||||
|
|
||||||
if (num_attributes > 0) state.input_register_table[attribute_register_map.attribute0_register] = &input.attr[0].x;
|
if (num_attributes > 0) state.input_register_table[attribute_register_map.attribute0_register] = &input.attr[0].x;
|
||||||
if (num_attributes > 1) state.input_register_table[attribute_register_map.attribute1_register] = &input.attr[1].x;
|
if (num_attributes > 1) state.input_register_table[attribute_register_map.attribute1_register] = &input.attr[1].x;
|
||||||
if (num_attributes > 2) state.input_register_table[attribute_register_map.attribute2_register] = &input.attr[2].x;
|
if (num_attributes > 2) state.input_register_table[attribute_register_map.attribute2_register] = &input.attr[2].x;
|
||||||
|
|
Reference in New Issue