Merge pull request #1335 from turtleli/freebsd

Support FreeBSD
This commit is contained in:
Jonathan Li 2016-05-25 18:55:51 +01:00
commit db81925c4b
76 changed files with 317 additions and 582 deletions

View File

@ -201,6 +201,11 @@ if(${PCSX2_TARGET_ARCHITECTURES} MATCHES "i386")
endif() endif()
endif() endif()
# Don't bother porting SuperVU
if (NOT Linux)
set(DISABLE_SVU TRUE)
endif()
add_definitions(-D_ARCH_32=1 -D_M_X86=1 -D_M_X86_32=1) add_definitions(-D_ARCH_32=1 -D_M_X86=1 -D_M_X86_32=1)
set(_ARCH_32 1) set(_ARCH_32 1)
set(_M_X86 1) set(_M_X86 1)
@ -293,7 +298,7 @@ set(AGGRESSIVE_WARNING "-Wstrict-aliasing -Wstrict-overflow=2 ")
if (USE_CLANG) if (USE_CLANG)
# -Wno-deprecated-register: glib issue... # -Wno-deprecated-register: glib issue...
set(DEFAULT_WARNINGS "${DEFAULT_WARNINGS} -Wno-deprecated-register -Wno-c++14-extensions") set(DEFAULT_WARNINGS "${DEFAULT_WARNINGS} -Wno-deprecated-register -Wno-c++14-extensions")
if (NOT APPLE) if (Linux)
set(COMMON_FLAG "${COMMON_FLAG} -no-integrated-as") set(COMMON_FLAG "${COMMON_FLAG} -no-integrated-as")
endif() endif()
set(DBG "-g -fno-omit-frame-pointer") set(DBG "-g -fno-omit-frame-pointer")

View File

@ -7,15 +7,20 @@ if(LIBC_LIBRARIES)
set(LIBC_FIND_QUIETLY TRUE) set(LIBC_FIND_QUIETLY TRUE)
endif(LIBC_LIBRARIES) endif(LIBC_LIBRARIES)
find_library(libdl NAMES dl)
find_library(libm NAMES m) find_library(libm NAMES m)
# OSX doesn't have rt. On Linux timer and aio dependency. # OSX doesn't have rt. On Linux timer and aio dependency.
if(APPLE) if(APPLE)
find_library(libdl NAMES dl)
set(LIBC_LIBRARIES ${librt} ${libdl} ${libm}) set(LIBC_LIBRARIES ${librt} ${libdl} ${libm})
else() elseif(Linux)
find_library(libdl NAMES dl)
find_library(librt NAMES rt) find_library(librt NAMES rt)
set(LIBC_LIBRARIES ${librt} ${libdl} ${libm}) set(LIBC_LIBRARIES ${librt} ${libdl} ${libm})
else()
# FreeBSD doesn't have libdl
find_library(librt NAMES rt)
set(LIBC_LIBRARIES ${librt} ${libm})
endif() endif()
# handle the QUIETLY and REQUIRED arguments and set LIBC_FOUND to TRUE if # handle the QUIETLY and REQUIRED arguments and set LIBC_FOUND to TRUE if

View File

@ -2,7 +2,9 @@
# Search all libraries on the system # Search all libraries on the system
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
## Use cmake package to find module ## Use cmake package to find module
find_package(ALSA) if (Linux)
find_package(ALSA)
endif()
find_package(Gettext) # translation tool find_package(Gettext) # translation tool
if(EXISTS ${PROJECT_SOURCE_DIR}/.git) if(EXISTS ${PROJECT_SOURCE_DIR}/.git)
find_package(Git) find_package(Git)
@ -50,6 +52,9 @@ if(CMAKE_CROSSCOMPILING)
endif() endif()
endif() endif()
else() else()
if (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
set(wxWidgets_CONFIG_EXECUTABLE "/usr/local/bin/wxgtk2u-3.0-config")
endif()
if(EXISTS "/usr/bin/wx-config-3.0") if(EXISTS "/usr/bin/wx-config-3.0")
set(wxWidgets_CONFIG_EXECUTABLE "/usr/bin/wx-config-3.0") set(wxWidgets_CONFIG_EXECUTABLE "/usr/bin/wx-config-3.0")
endif() endif()

View File

@ -218,7 +218,7 @@ endif()
#--------------------------------------- #---------------------------------------
# Not ready to be packaged # Not ready to be packaged
if(EXTRA_PLUGINS OR NOT PACKAGE_MODE) if(EXTRA_PLUGINS OR NOT PACKAGE_MODE)
if(GTKn_FOUND AND X11_FOUND) if(Linux AND GTKn_FOUND AND X11_FOUND)
set(LilyPad TRUE) set(LilyPad TRUE)
endif() endif()
endif() endif()
@ -257,8 +257,8 @@ endif()
# -SDL # -SDL
# -common_libs # -common_libs
#--------------------------------------- #---------------------------------------
if((APPLE AND PORTAUDIO_FOUND AND SOUNDTOUCH_FOUND AND SDLn_FOUND AND common_libs) if((PORTAUDIO_FOUND AND SOUNDTOUCH_FOUND AND SDLn_FOUND AND common_libs)
OR (Linux AND ALSA_FOUND AND PORTAUDIO_FOUND AND SOUNDTOUCH_FOUND AND SDLn_FOUND AND common_libs)) AND ((Linux AND ALSA_FOUND) OR (UNIX AND NOT Linux)))
set(spu2-x TRUE) set(spu2-x TRUE)
elseif(NOT EXISTS "${CMAKE_SOURCE_DIR}/plugins/spu2-x") elseif(NOT EXISTS "${CMAKE_SOURCE_DIR}/plugins/spu2-x")
set(spu2-x FALSE) set(spu2-x FALSE)

View File

@ -30,7 +30,7 @@
#define EXPORT_C_(type) extern "C" type CALLBACK #define EXPORT_C_(type) extern "C" type CALLBACK
#elif defined(__linux__) #elif defined(__unix__)
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <cstring> #include <cstring>
@ -193,7 +193,7 @@ struct PluginConf
} }
}; };
#if defined(__linux__) #if defined(__unix__)
static void SysMessage(const char *fmt, ...) static void SysMessage(const char *fmt, ...)
{ {

View File

@ -213,9 +213,12 @@ static const int __pagesize = PCSX2_PAGESIZE;
// GCC / Intel Compilers Section // GCC / Intel Compilers Section
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------
#ifndef __packed
# define __packed __attribute__((packed)) # define __packed __attribute__((packed))
#endif
#ifndef __aligned
# define __aligned(alig) __attribute__((aligned(alig))) # define __aligned(alig) __attribute__((aligned(alig)))
#endif
# define __aligned16 __attribute__((aligned(16))) # define __aligned16 __attribute__((aligned(16)))
# define __aligned32 __attribute__((aligned(32))) # define __aligned32 __attribute__((aligned(32)))
# define __pagealigned __attribute__((aligned(PCSX2_PAGESIZE))) # define __pagealigned __attribute__((aligned(PCSX2_PAGESIZE)))
@ -232,14 +235,18 @@ static const int __pagesize = PCSX2_PAGESIZE;
// warnings when a static inlined function isn't used in the scope of a single file (which // warnings when a static inlined function isn't used in the scope of a single file (which
// happens *by design* like all the friggen time >_<) // happens *by design* like all the friggen time >_<)
#ifndef __fastcall
# define __fastcall __attribute__((fastcall)) # define __fastcall __attribute__((fastcall))
#endif
# define _inline __inline__ __attribute__((unused)) # define _inline __inline__ __attribute__((unused))
# ifdef NDEBUG # ifdef NDEBUG
# define __forceinline __attribute__((always_inline,unused)) # define __forceinline __attribute__((always_inline,unused))
# else # else
# define __forceinline __attribute__((unused)) # define __forceinline __attribute__((unused))
# endif # endif
#ifndef __noinline
# define __noinline __attribute__((noinline)) # define __noinline __attribute__((noinline))
#endif
# define __threadlocal __thread # define __threadlocal __thread
# define likely(x) __builtin_expect(!!(x), 1) # define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0) # define unlikely(x) __builtin_expect(!!(x), 0)

View File

@ -234,7 +234,7 @@ public:
extern IConsoleWriter Console; extern IConsoleWriter Console;
#ifdef __linux__ #if defined(__unix__)
extern void Console_SetStdout(FILE *fp); extern void Console_SetStdout(FILE *fp);
#endif #endif
extern void Console_SetActiveHandler( const IConsoleWriter& writer, FILE* flushfp=NULL ); extern void Console_SetActiveHandler( const IConsoleWriter& writer, FILE* flushfp=NULL );

View File

@ -113,7 +113,7 @@ const IConsoleWriter ConsoleWriter_Null =
// Console_Stdout // Console_Stdout
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------
#ifdef __linux__ #if defined(__unix__)
static __fi const char* GetLinuxConsoleColor(ConsoleColors color) static __fi const char* GetLinuxConsoleColor(ConsoleColors color)
{ {
switch(color) switch(color)
@ -174,7 +174,7 @@ static void __concall ConsoleStdout_Newline()
static void __concall ConsoleStdout_DoSetColor( ConsoleColors color ) static void __concall ConsoleStdout_DoSetColor( ConsoleColors color )
{ {
#ifdef __linux__ #if defined(__unix__)
fprintf(stdout_fp, "\033[0m%s", GetLinuxConsoleColor(color)); fprintf(stdout_fp, "\033[0m%s", GetLinuxConsoleColor(color));
fflush(stdout_fp); fflush(stdout_fp);
#endif #endif
@ -182,7 +182,7 @@ static void __concall ConsoleStdout_DoSetColor( ConsoleColors color )
static void __concall ConsoleStdout_SetTitle( const wxString& title ) static void __concall ConsoleStdout_SetTitle( const wxString& title )
{ {
#ifdef __linux__ #if defined(__unix__)
fputs("\033]0;", stdout_fp); fputs("\033]0;", stdout_fp);
fputs(title.utf8_str(), stdout_fp); fputs(title.utf8_str(), stdout_fp);
fputs("\007", stdout_fp); fputs("\007", stdout_fp);

View File

@ -16,16 +16,20 @@
#include "../PrecompiledHeader.h" #include "../PrecompiledHeader.h"
#include "PersistentThread.h" #include "PersistentThread.h"
#include <sys/prctl.h>
#include <unistd.h> #include <unistd.h>
#if defined(__linux__)
#include <sys/prctl.h>
#elif defined(__unix__)
#include <pthread_np.h>
#endif
// We wont need this until we actually have this more then just stubbed out, so I'm commenting this out // We wont need this until we actually have this more then just stubbed out, so I'm commenting this out
// to remove an unneeded dependency. // to remove an unneeded dependency.
//#include "x86emitter/tools.h" //#include "x86emitter/tools.h"
#if !defined(__linux__) && !defined(__WXMAC__) #if !defined(__unix__)
# pragma message( "LnxThreads.cpp should only be compiled by projects or makefiles targeted at Linux/Mac distros.") # pragma message( "LnxThreads.cpp should only be compiled by projects or makefiles targeted at Linux/BSD distros.")
#else #else
@ -68,7 +72,7 @@ static u64 get_thread_time(uptr id = 0)
{ {
clockid_t cid; clockid_t cid;
if (id) { if (id) {
int err = pthread_getcpuclockid(id, &cid); int err = pthread_getcpuclockid((pthread_t)id, &cid);
if (err) return 0; if (err) return 0;
} else { } else {
cid = CLOCK_THREAD_CPUTIME_ID; cid = CLOCK_THREAD_CPUTIME_ID;
@ -113,9 +117,13 @@ void Threading::pxThread::_platform_specific_OnCleanupInThread()
void Threading::pxThread::_DoSetThreadName( const char* name ) void Threading::pxThread::_DoSetThreadName( const char* name )
{ {
#if defined(__linux__)
// Extract of manpage: "The name can be up to 16 bytes long, and should be // Extract of manpage: "The name can be up to 16 bytes long, and should be
// null-terminated if it contains fewer bytes." // null-terminated if it contains fewer bytes."
prctl(PR_SET_NAME, name, 0, 0, 0); prctl(PR_SET_NAME, name, 0, 0, 0);
#elif defined(__unix__)
pthread_set_name_np(pthread_self(), name);
#endif
} }
#endif #endif

View File

@ -20,7 +20,7 @@
# undef Yield # undef Yield
#elif defined(__linux__) #elif defined(__linux__)
# include <libaio.h> # include <libaio.h>
#elif defined(__APPLE__) #elif defined(__POSIX__)
# include <aio.h> # include <aio.h>
#endif #endif
#include <memory> #include <memory>
@ -78,7 +78,8 @@ class FlatFileReader : public AsyncFileReader
io_context_t m_aio_context; io_context_t m_aio_context;
#elif defined(__POSIX__) #elif defined(__POSIX__)
int m_fd; // TODO OSX don't know if overlap as an equivalent on OSX int m_fd; // TODO OSX don't know if overlap as an equivalent on OSX
struct aiocb m_aio_context; struct aiocb m_aiocb;
bool m_read_in_progress;
#endif #endif
bool shareWrite; bool shareWrite;

View File

@ -397,6 +397,12 @@ set(pcsx2OSXSources
Darwin/DarwinFlatFileReader.cpp Darwin/DarwinFlatFileReader.cpp
) )
set(pcsx2FreeBSDSources
Linux/LnxConsolePipe.cpp
Linux/LnxKeyCodes.cpp
Darwin/DarwinFlatFileReader.cpp
)
# Linux headers # Linux headers
set(pcsx2LinuxHeaders set(pcsx2LinuxHeaders
) )
@ -615,6 +621,12 @@ if(APPLE)
${pcsx2LinuxHeaders}) ${pcsx2LinuxHeaders})
endif() endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
set(Platform
${pcsx2FreeBSDSources}
${pcsx2LinuxHeaders})
endif()
set(pcsx2FinalSources set(pcsx2FinalSources
${Common} ${Common}
${Platform} ${Platform}

View File

@ -16,15 +16,16 @@
#include "PrecompiledHeader.h" #include "PrecompiledHeader.h"
#include "AsyncFileReader.h" #include "AsyncFileReader.h"
#warning This reader is not yet implemented. Crash boom bang if used #if defined(__APPLE__)
#warning Tested on FreeBSD, not OS X. Be very afraid.
#endif
//FlatFileReader::FlatFileReader(void) //FlatFileReader::FlatFileReader(void)
FlatFileReader::FlatFileReader(bool shareWrite) : shareWrite(shareWrite) FlatFileReader::FlatFileReader(bool shareWrite) : shareWrite(shareWrite)
{ {
printf("FLATC\n");
m_blocksize = 2048; m_blocksize = 2048;
m_fd = 0; m_fd = -1;
//m_aio_context = 0; m_read_in_progress = false;
} }
FlatFileReader::~FlatFileReader(void) FlatFileReader::~FlatFileReader(void)
@ -34,79 +35,74 @@ FlatFileReader::~FlatFileReader(void)
bool FlatFileReader::Open(const wxString& fileName) bool FlatFileReader::Open(const wxString& fileName)
{ {
printf("OB\n");
m_filename = fileName; m_filename = fileName;
int err = 0; //io_setup(64, &m_aio_context);
if (err) return false;
m_fd = wxOpen(fileName, O_RDONLY, 0); m_fd = wxOpen(fileName, O_RDONLY, 0);
return (m_fd != 0); return (m_fd != -1);
} }
int FlatFileReader::ReadSync(void* pBuffer, uint sector, uint count) int FlatFileReader::ReadSync(void* pBuffer, uint sector, uint count)
{ {
printf("RAD\n");
BeginRead(pBuffer, sector, count); BeginRead(pBuffer, sector, count);
return FinishRead(); return FinishRead();
} }
void FlatFileReader::BeginRead(void* pBuffer, uint sector, uint count) void FlatFileReader::BeginRead(void* pBuffer, uint sector, uint count)
{ {
printf("RWEADB\n"); u64 offset = sector * (u64)m_blocksize + m_dataoffset;
u64 offset;
offset = sector * (u64)m_blocksize + m_dataoffset;
u32 bytesToRead = count * m_blocksize; u32 bytesToRead = count * m_blocksize;
struct aiocb iocb; m_aiocb = {0};
struct aiocb* iocbs = &iocb; m_aiocb.aio_fildes = m_fd;
m_aiocb.aio_offset = offset;
m_aiocb.aio_nbytes = bytesToRead;
m_aiocb.aio_buf = pBuffer;
//io_prep_pread(&iocb, m_fd, pBuffer, bytesToRead, offset); if (aio_read(&m_aiocb) != 0) {
//io_submit(m_aio_context, 1, &iocbs); #if defined(__FreeBSD__)
if (errno == ENOSYS)
Console.Error("AIO read failed: Check the aio kernel module is loaded");
else
Console.Error("AIO read failed: error code %d", errno);
#else
Console.Error("AIO read failed: error code %d\n", errno);
#endif
return;
}
m_read_in_progress = true;
} }
int FlatFileReader::FinishRead(void) int FlatFileReader::FinishRead(void)
{ {
printf("FINISH\n"); struct aiocb *aiocb_list[] = {&m_aiocb};
u32 bytes;
int min_nr = 1; while (aio_suspend(aiocb_list, 1, nullptr) == -1)
int max_nr = 1; if (errno != EINTR)
/* struct io_event* events = new io_event[max_nr]; break;
int event = io_getevents(m_aio_context, min_nr, max_nr, events, NULL); m_read_in_progress = false;
if (event < 1) { return aio_return(&m_aiocb) == -1? -1: 1;
return -1;
}*/
return 1;
} }
void FlatFileReader::CancelRead(void) void FlatFileReader::CancelRead(void)
{ {
printf("CANCEL\n"); aio_cancel(m_fd, &m_aiocb);
// Will be done when m_aio_context context is destroyed m_read_in_progress = false;
// Note: io_cancel exists but need the iocb structure as parameter
// int io_cancel(aio_context_t ctx_id, struct iocb *iocb,
// struct io_event *result);
} }
void FlatFileReader::Close(void) void FlatFileReader::Close(void)
{ {
printf("CLOSE\n"); if (m_read_in_progress)
if (m_fd) close(m_fd); CancelRead();
if (m_fd != -1)
close(m_fd);
//io_destroy(m_aio_context); m_fd = -1;
aio_cancel(m_fd, &m_aio_context);
m_fd = 0;
//m_aio_context = 0;
} }
uint FlatFileReader::GetBlockCount(void) const uint FlatFileReader::GetBlockCount(void) const
{ {
printf("BLOCKS\n");
return (int)(Path::GetFileSize(m_filename) / m_blocksize); return (int)(Path::GetFileSize(m_filename) / m_blocksize);
} }

View File

@ -1,5 +1,5 @@
/* PCSX2 - PS2 Emulator for PCs /* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2010 PCSX2 Dev Team * Copyright (C) 2002-2016 PCSX2 Dev Team
* *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms * PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found- * of the GNU Lesser General Public License as published by the Free Software Found-
@ -58,356 +58,94 @@ void yuv2rgb_reference(void)
} }
} }
// TODO OSX optimize me // Suikoden Tactics FMV speed results: Reference - ~72fps, SSE2 - ~120fps
#ifdef __APPLE__ // An AVX2 version is only slightly faster than an SSE2 version (+2-3fps)
void yuv2rgb_sse2() { // (or I'm a poor optimiser), though it might be worth attempting again
yuv2rgb_reference(); // once we've ported to 64 bits (the extra registers should help).
} __ri void yuv2rgb_sse2()
#elif defined(_M_X86_32)
// Everything below is bit accurate to the IPU specification (except maybe rounding).
// Know the specification before you touch it.
#define SSE_BYTES(x) {x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x}
#define SSE_WORDS(x) {x, x, x, x, x, x, x, x}
#define SSE_COEFFICIENTS(x) SSE_WORDS((s16)((x)<<2))
struct SSE2_Tables
{ {
u16 C_bias[8]; // offset -64 const __m128i c_bias = _mm_set1_epi8(s8(IPU_C_BIAS));
u8 Y_bias[16]; // offset -48 const __m128i y_bias = _mm_set1_epi8(IPU_Y_BIAS);
u16 Y_mask[8]; // offset -32 const __m128i y_mask = _mm_set1_epi16(s16(0xFF00));
u16 round_1bit[8]; // offset -16
s16 Y_coefficients[8]; // offset 0
s16 GCr_coefficients[8];// offset 16
s16 GCb_coefficients[8];// offset 32
s16 RCr_coefficients[8];// offset 48
s16 BCb_coefficients[8];// offset 64
};
enum
{
C_BIAS = -0x40,
Y_BIAS = -0x30,
Y_MASK = -0x20,
ROUND_1BIT = -0x10,
Y_COEFF = 0x00,
GCr_COEFF = 0x10,
GCb_COEFF = 0x20,
RCr_COEFF = 0x30,
BCb_COEFF = 0x40
};
static const __aligned16 SSE2_Tables sse2_tables =
{
SSE_WORDS(0x8000), // c_bias
SSE_BYTES(IPU_Y_BIAS), // y_bias
SSE_WORDS(0xff00), // y_mask
// Specifying round off instead of round down as everywhere else // Specifying round off instead of round down as everywhere else
// implies that this is right // implies that this is right
SSE_WORDS(1), // round_1bit const __m128i round_1bit = _mm_set1_epi16(0x0001);;
SSE_COEFFICIENTS(IPU_Y_COEFF), const __m128i y_coefficient = _mm_set1_epi16(s16(IPU_Y_COEFF << 2));
SSE_COEFFICIENTS(IPU_GCR_COEFF), const __m128i gcr_coefficient = _mm_set1_epi16(s16(u16(IPU_GCR_COEFF) << 2));
SSE_COEFFICIENTS(IPU_GCB_COEFF), const __m128i gcb_coefficient = _mm_set1_epi16(s16(u16(IPU_GCB_COEFF) << 2));
SSE_COEFFICIENTS(IPU_RCR_COEFF), const __m128i rcr_coefficient = _mm_set1_epi16(s16(IPU_RCR_COEFF << 2));
SSE_COEFFICIENTS(IPU_BCB_COEFF), const __m128i bcb_coefficient = _mm_set1_epi16(s16(IPU_BCB_COEFF << 2));
};
static __aligned16 u16 yuv2rgb_temp[3][8]; // Alpha set to 0x80 here. The threshold stuff is done later.
const __m128i& alpha = c_bias;
// This could potentially be improved for SSE4 for (int n = 0; n < 8; ++n) {
__ri void yuv2rgb_sse2(void) // could skip the loadl_epi64 but most SSE instructions require 128-bit
{ // alignment so two versions would be needed.
#if defined(_MSC_VER) || defined(__INTEL_COMPILER) __m128i cb = _mm_loadl_epi64(reinterpret_cast<__m128i*>(&decoder.mb8.Cb[n][0]));
__asm { __m128i cr = _mm_loadl_epi64(reinterpret_cast<__m128i*>(&decoder.mb8.Cr[n][0]));
mov eax, 1
xor esi, esi
xor edi, edi
// Use ecx and edx as base pointers, to allow for Mod/RM form on memOps. // (Cb - 128) << 8, (Cr - 128) << 8
// This saves 2-3 bytes per instruction where these are used. :) cb = _mm_xor_si128(cb, c_bias);
mov ecx, offset yuv2rgb_temp cr = _mm_xor_si128(cr, c_bias);
mov edx, offset sse2_tables+64; cb = _mm_unpacklo_epi8(_mm_setzero_si128(), cb);
cr = _mm_unpacklo_epi8(_mm_setzero_si128(), cr);
align 16 __m128i rc = _mm_mulhi_epi16(cr, rcr_coefficient);
tworows: __m128i gc = _mm_adds_epi16(_mm_mulhi_epi16(cr, gcr_coefficient), _mm_mulhi_epi16(cb, gcb_coefficient));
movq xmm3, qword ptr [decoder.mb8+256+esi] __m128i bc = _mm_mulhi_epi16(cb, bcb_coefficient);
movq xmm1, qword ptr [decoder.mb8+320+esi]
pxor xmm2, xmm2
pxor xmm0, xmm0
// could skip the movq but punpck requires 128-bit alignment
// for some reason, so two versions would be needed,
// bloating the function (further)
punpcklbw xmm2, xmm3
punpcklbw xmm0, xmm1
// unfortunately I don't think this will matter despite being
// technically potentially a little faster, but this is
// equivalent to an add or sub
pxor xmm2, xmmword ptr [edx+C_BIAS] // xmm2 <-- 8 x (Cb - 128) << 8
pxor xmm0, xmmword ptr [edx+C_BIAS] // xmm0 <-- 8 x (Cr - 128) << 8
movaps xmm1, xmm0 for (int m = 0; m < 2; ++m) {
movaps xmm3, xmm2 __m128i y = _mm_load_si128(reinterpret_cast<__m128i*>(&decoder.mb8.Y[n * 2 + m][0]));
pmulhw xmm1, xmmword ptr [edx+GCr_COEFF] y = _mm_subs_epu8(y, y_bias);
pmulhw xmm3, xmmword ptr [edx+GCb_COEFF] // Y << 8 for pixels 0, 2, 4, 6, 8, 10, 12, 14
pmulhw xmm0, xmmword ptr [edx+RCr_COEFF] __m128i y_even = _mm_slli_epi16(y, 8);
pmulhw xmm2, xmmword ptr [edx+BCb_COEFF] // Y << 8 for pixels 1, 3, 5, 7 ,9, 11, 13, 15
paddsw xmm1, xmm3 __m128i y_odd = _mm_and_si128(y, y_mask);
// store for the next line; looking at the code above
// compared to the code below, I have to wonder whether
// this was worth the hassle
movaps xmmword ptr [ecx], xmm0
movaps xmmword ptr [ecx+16], xmm1
movaps xmmword ptr [ecx+32], xmm2
jmp ihatemsvc
align 16 y_even = _mm_mulhi_epu16(y_even, y_coefficient);
onerow: y_odd = _mm_mulhi_epu16(y_odd, y_coefficient);
movaps xmm0, xmmword ptr [ecx]
movaps xmm1, xmmword ptr [ecx+16]
movaps xmm2, xmmword ptr [ecx+32]
// If masm directives worked properly in inline asm, I'd be using them, __m128i r_even = _mm_adds_epi16(rc, y_even);
// but I'm not inclined to write ~70 line #defines to simulate them. __m128i r_odd = _mm_adds_epi16(rc, y_odd);
// Maybe the function's faster like this anyway because it's smaller? __m128i g_even = _mm_adds_epi16(gc, y_even);
// I'd have to write a 70 line #define to benchmark it. __m128i g_odd = _mm_adds_epi16(gc, y_odd);
__m128i b_even = _mm_adds_epi16(bc, y_even);
__m128i b_odd = _mm_adds_epi16(bc, y_odd);
ihatemsvc: // round
movaps xmm3, xmm0 r_even = _mm_srai_epi16(_mm_add_epi16(r_even, round_1bit), 1);
movaps xmm4, xmm1 r_odd = _mm_srai_epi16(_mm_add_epi16(r_odd, round_1bit), 1);
movaps xmm5, xmm2 g_even = _mm_srai_epi16(_mm_add_epi16(g_even, round_1bit), 1);
g_odd = _mm_srai_epi16(_mm_add_epi16(g_odd, round_1bit), 1);
b_even = _mm_srai_epi16(_mm_add_epi16(b_even, round_1bit), 1);
b_odd = _mm_srai_epi16(_mm_add_epi16(b_odd, round_1bit), 1);
movaps xmm6, xmmword ptr [decoder.mb8+edi] // combine even and odd bytes in original order
psubusb xmm6, xmmword ptr [edx+Y_BIAS] __m128i r = _mm_packus_epi16(r_even, r_odd);
movaps xmm7, xmm6 __m128i g = _mm_packus_epi16(g_even, g_odd);
psllw xmm6, 8 // xmm6 <- Y << 8 for pixels 0,2,4,6,8,10,12,14 __m128i b = _mm_packus_epi16(b_even, b_odd);
pand xmm7, xmmword ptr [edx+Y_MASK] // xmm7 <- Y << 8 for pixels 1,3,5,7,9,11,13,15
pmulhuw xmm6, xmmword ptr [edx+Y_COEFF] r = _mm_unpacklo_epi8(r, _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 3, 2)));
pmulhuw xmm7, xmmword ptr [edx+Y_COEFF] g = _mm_unpacklo_epi8(g, _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 2, 3, 2)));
b = _mm_unpacklo_epi8(b, _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 3, 2)));
paddsw xmm0, xmm6 // Create RGBA (we could generate A here, but we don't) quads
paddsw xmm3, xmm7 __m128i rg_l = _mm_unpacklo_epi8(r, g);
paddsw xmm1, xmm6 __m128i ba_l = _mm_unpacklo_epi8(b, alpha);
paddsw xmm4, xmm7 __m128i rgba_ll = _mm_unpacklo_epi16(rg_l, ba_l);
paddsw xmm2, xmm6 __m128i rgba_lh = _mm_unpackhi_epi16(rg_l, ba_l);
paddsw xmm5, xmm7
// 0x80; a constant is probably so much better __m128i rg_h = _mm_unpackhi_epi8(r, g);
pcmpeqb xmm7, xmm7 __m128i ba_h = _mm_unpackhi_epi8(b, alpha);
psllw xmm7, 15 __m128i rgba_hl = _mm_unpacklo_epi16(rg_h, ba_h);
psrlw xmm7, 8 __m128i rgba_hh = _mm_unpackhi_epi16(rg_h, ba_h);
packuswb xmm7, xmm7
// round _mm_store_si128(reinterpret_cast<__m128i*>(&decoder.rgb32.c[n * 2 + m][0]), rgba_ll);
movaps xmm6, xmmword ptr [edx+ROUND_1BIT] _mm_store_si128(reinterpret_cast<__m128i*>(&decoder.rgb32.c[n * 2 + m][4]), rgba_lh);
paddw xmm0, xmm6 _mm_store_si128(reinterpret_cast<__m128i*>(&decoder.rgb32.c[n * 2 + m][8]), rgba_hl);
paddw xmm1, xmm6 _mm_store_si128(reinterpret_cast<__m128i*>(&decoder.rgb32.c[n * 2 + m][12]), rgba_hh);
paddw xmm2, xmm6 }
paddw xmm3, xmm6
paddw xmm4, xmm6
paddw xmm5, xmm6
psraw xmm0, 1
psraw xmm1, 1
psraw xmm2, 1
psraw xmm3, 1
psraw xmm4, 1
psraw xmm5, 1
// combine even and odd bytes
packuswb xmm0, xmm3
packuswb xmm1, xmm4
packuswb xmm2, xmm5
movhlps xmm3, xmm0
movhlps xmm4, xmm1
movhlps xmm5, xmm2
punpcklbw xmm0, xmm3 // Red bytes, back in order
punpcklbw xmm1, xmm4 // Green ""
punpcklbw xmm2, xmm5 // Blue ""
movaps xmm3, xmm0
movaps xmm4, xmm1
movaps xmm5, xmm2
// Create RGBA (we could generate A here, but we don't) quads
punpcklbw xmm0, xmm1
punpcklbw xmm2, xmm7
movaps xmm1, xmm0
punpcklwd xmm0, xmm2
punpckhwd xmm1, xmm2
punpckhbw xmm3, xmm4
punpckhbw xmm5, xmm7
movaps xmm4, xmm3
punpcklwd xmm3, xmm5
punpckhwd xmm4, xmm5
// at last
movaps xmmword ptr [decoder.rgb32+edi*4+0], xmm0
movaps xmmword ptr [decoder.rgb32+edi*4+16], xmm1
movaps xmmword ptr [decoder.rgb32+edi*4+32], xmm3
movaps xmmword ptr [decoder.rgb32+edi*4+48], xmm4
add edi, 16
neg eax
jl onerow // run twice
add esi, 8
cmp esi, 64
jne tworows
} }
#elif defined(__GNUC__)
// offset to the middle of the sse2 table, so that we can use 1-byte address displacement
// to access all fields:
static const u8* sse2_tableoffset = ((u8*)&sse2_tables) + 64;
static const u8* mb8 = (u8*)&decoder.mb8;
static u8* rgb32 = (u8*)&decoder.rgb32;
__asm__ __volatile__ (
".intel_syntax noprefix\n"
"xor esi, esi\n"
"xor edi, edi\n"
".align 16\n"
"tworows_%=:\n"
"movq xmm3, qword ptr [%[mb8]+256+esi]\n"
"movq xmm1, qword ptr [%[mb8]+320+esi]\n"
"pxor xmm2, xmm2\n"
"pxor xmm0, xmm0\n"
// could skip the movq but punpck requires 128-bit alignment
// for some reason, so two versions would be needed,
// bloating the function (further)
"punpcklbw xmm2, xmm3\n"
"punpcklbw xmm0, xmm1\n"
// unfortunately I don't think this will matter despite being
// technically potentially a little faster, but this is
// equivalent to an add or sub
"pxor xmm2, xmmword ptr [%[sse2_tables]+%c[C_BIAS]]\n" // xmm2 <-- 8 x (Cb - 128) << 8
"pxor xmm0, xmmword ptr [%[sse2_tables]+%c[C_BIAS]]\n" // xmm0 <-- 8 x (Cr - 128) << 8
"movaps xmm1, xmm0\n"
"movaps xmm3, xmm2\n"
"pmulhw xmm1, xmmword ptr [%[sse2_tables]+%c[GCr_COEFF]]\n"
"pmulhw xmm3, xmmword ptr [%[sse2_tables]+%c[GCb_COEFF]]\n"
"pmulhw xmm0, xmmword ptr [%[sse2_tables]+%c[RCr_COEFF]]\n"
"pmulhw xmm2, xmmword ptr [%[sse2_tables]+%c[BCb_COEFF]]\n"
"paddsw xmm1, xmm3\n"
// store for the next line; looking at the code above
// compared to the code below, I have to wonder whether
// this was worth the hassle
"movaps xmmword ptr [%[yuv2rgb_temp]], xmm0\n"
"movaps xmmword ptr [%[yuv2rgb_temp]+16], xmm1\n"
"movaps xmmword ptr [%[yuv2rgb_temp]+32], xmm2\n"
"jmp ihategcctoo_%=\n"
".align 16\n"
"onerow_%=:\n"
"movaps xmm0, xmmword ptr [%[yuv2rgb_temp]]\n"
"movaps xmm1, xmmword ptr [%[yuv2rgb_temp]+16]\n"
"movaps xmm2, xmmword ptr [%[yuv2rgb_temp]+32]\n"
"ihategcctoo_%=:\n"
"movaps xmm3, xmm0\n"
"movaps xmm4, xmm1\n"
"movaps xmm5, xmm2\n"
"movaps xmm6, xmmword ptr [%[mb8]+edi]\n"
"psubusb xmm6, xmmword ptr [%[sse2_tables]+%c[Y_BIAS]]\n"
"movaps xmm7, xmm6\n"
"psllw xmm6, 8\n" // xmm6 <- Y << 8 for pixels 0,2,4,6,8,10,12,14
"pand xmm7, xmmword ptr [%[sse2_tables]+%c[Y_MASK]]\n" // xmm7 <- Y << 8 for pixels 1,3,5,7,9,11,13,15
"pmulhuw xmm6, xmmword ptr [%[sse2_tables]+%c[Y_COEFF]]\n"
"pmulhuw xmm7, xmmword ptr [%[sse2_tables]+%c[Y_COEFF]]\n"
"paddsw xmm0, xmm6\n"
"paddsw xmm3, xmm7\n"
"paddsw xmm1, xmm6\n"
"paddsw xmm4, xmm7\n"
"paddsw xmm2, xmm6\n"
"paddsw xmm5, xmm7\n"
// 0x80; a constant is probably so much better
"pcmpeqb xmm7, xmm7\n"
"psllw xmm7, 15\n"
"psrlw xmm7, 8\n"
"packuswb xmm7, xmm7\n"
// round
"movaps xmm6, xmmword ptr [%[sse2_tables]+%c[ROUND_1BIT]]\n"
"paddw xmm0, xmm6\n"
"paddw xmm1, xmm6\n"
"paddw xmm2, xmm6\n"
"paddw xmm3, xmm6\n"
"paddw xmm4, xmm6\n"
"paddw xmm5, xmm6\n"
"psraw xmm0, 1\n"
"psraw xmm1, 1\n"
"psraw xmm2, 1\n"
"psraw xmm3, 1\n"
"psraw xmm4, 1\n"
"psraw xmm5, 1\n"
// combine even and odd bytes
"packuswb xmm0, xmm3\n"
"packuswb xmm1, xmm4\n"
"packuswb xmm2, xmm5\n"
"movhlps xmm3, xmm0\n"
"movhlps xmm4, xmm1\n"
"movhlps xmm5, xmm2\n"
"punpcklbw xmm0, xmm3\n" // Red bytes, back in order
"punpcklbw xmm1, xmm4\n" // Green ""
"punpcklbw xmm2, xmm5\n" // Blue ""
"movaps xmm3, xmm0\n"
"movaps xmm4, xmm1\n"
"movaps xmm5, xmm2\n"
// Create RGBA (we could generate A here, but we don't) quads
"punpcklbw xmm0, xmm1\n"
"punpcklbw xmm2, xmm7\n"
"movaps xmm1, xmm0\n"
"punpcklwd xmm0, xmm2\n"
"punpckhwd xmm1, xmm2\n"
"punpckhbw xmm3, xmm4\n"
"punpckhbw xmm5, xmm7\n"
"movaps xmm4, xmm3\n"
"punpcklwd xmm3, xmm5\n"
"punpckhwd xmm4, xmm5\n"
// at last
"movaps xmmword ptr [%[rgb32]+edi*4+0], xmm0\n"
"movaps xmmword ptr [%[rgb32]+edi*4+16], xmm1\n"
"movaps xmmword ptr [%[rgb32]+edi*4+32], xmm3\n"
"movaps xmmword ptr [%[rgb32]+edi*4+48], xmm4\n"
"add edi, 16\n"
// run twice the onerow <=> edi = 16 or 48 or 80 etc... <=> check bit 5
"test edi, 16\n"
"jnz onerow_%=\n"
"add esi, 8\n"
"cmp esi, 64\n"
"jne tworows_%=\n"
".att_syntax\n"
:
:[C_BIAS]"i"(C_BIAS), [Y_BIAS]"i"(Y_BIAS), [Y_MASK]"i"(Y_MASK),
[ROUND_1BIT]"i"(ROUND_1BIT), [Y_COEFF]"i"(Y_COEFF), [GCr_COEFF]"i"(GCr_COEFF),
[GCb_COEFF]"i"(GCb_COEFF), [RCr_COEFF]"i"(RCr_COEFF), [BCb_COEFF]"i"(BCb_COEFF),
// Use ecx and edx as base pointers, to allow for Mod/RM form on memOps.
// This saves 2-3 bytes per instruction where these are used. :)
[yuv2rgb_temp]"c"(yuv2rgb_temp), [sse2_tables]"d"(sse2_tableoffset),
[mb8]"r"(mb8), [rgb32]"r"(rgb32)
: "esi", "edi", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "memory"
);
#else
# error Unsupported compiler
#endif
} }
#endif

View File

@ -1,5 +1,5 @@
/* PCSX2 - PS2 Emulator for PCs /* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2010 PCSX2 Dev Team * Copyright (C) 2002-2016 PCSX2 Dev Team
* *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms * PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found- * of the GNU Lesser General Public License as published by the Free Software Found-
@ -16,9 +16,6 @@
#pragma once #pragma once
extern void yuv2rgb_reference(); extern void yuv2rgb_reference();
#ifdef _M_X86_32
#define yuv2rgb yuv2rgb_sse2 #define yuv2rgb yuv2rgb_sse2
extern void yuv2rgb_sse2(); extern void yuv2rgb_sse2();
#else
#define yuv2rgb yuv2rgb_reference
#endif

View File

@ -20,6 +20,7 @@
#include "IopGte.h" #include "IopGte.h"
//#include "R3000A.h" //#include "R3000A.h"
#include "IopCommon.h" #include "IopCommon.h"
#include "Utilities/MathUtils.h"
#ifdef GTE_DUMP #ifdef GTE_DUMP
#define G_OP(name,delay) fprintf(gteLog, "* : %08X : %02d : %s\n", psxRegs.code, delay, name); #define G_OP(name,delay) fprintf(gteLog, "* : %08X : %02d : %s\n", psxRegs.code, delay, name);
#define G_SD(reg) fprintf(gteLog, "+D%02d : %08X\n", reg, psxRegs.CP2D.r[reg]); #define G_SD(reg) fprintf(gteLog, "+D%02d : %08X\n", reg, psxRegs.CP2D.r[reg]);
@ -175,8 +176,6 @@ __inline unsigned long MFC2(int reg) {
} }
__inline void MTC2(unsigned long value, int reg) { __inline void MTC2(unsigned long value, int reg) {
int a;
switch (reg) { switch (reg) {
case 8: case 9: case 10: case 11: case 8: case 9: case 10: case 11:
psxRegs.CP2D.r[reg] = (short)value; psxRegs.CP2D.r[reg] = (short)value;
@ -208,58 +207,7 @@ __inline void MTC2(unsigned long value, int reg) {
case 30: case 30:
psxRegs.CP2D.r[30] = value; psxRegs.CP2D.r[30] = value;
psxRegs.CP2D.r[31] = count_leading_sign_bits(value);
a = psxRegs.CP2D.r[30];
#if defined(_MSC_VER_)
if (a > 0) {
__asm {
mov eax, a;
bsr eax, eax;
mov a, eax;
}
psxRegs.CP2D.r[31] = 31 - a;
}
else if (a < 0) {
__asm {
mov eax, a;
xor eax, 0xffffffff;
bsr eax, eax;
mov a, eax;
}
psxRegs.CP2D.r[31] = 31 - a;
}
else {
psxRegs.CP2D.r[31] = 32;
}
#elif defined(__linux__) || defined(__MINGW32__)
if (a > 0) {
__asm__("bsrl %1, %0\n" : "=r"(a) : "r"(a));
psxRegs.CP2D.r[31] = 31 - a;
}
else if (a < 0) {
a ^= 0xffffffff;
__asm__("bsrl %1, %0\n" : "=r"(a) : "r"(a));
psxRegs.CP2D.r[31] = 31 - a;
}
else {
psxRegs.CP2D.r[31] = 32;
}
#else
if (a > 0) {
int i;
for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--);
psxRegs.CP2D.r[31] = 31 - i;
}
else if (a < 0) {
int i;
a ^= 0xffffffff;
for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--);
psxRegs.CP2D.r[31] = 31 - i;
}
else {
psxRegs.CP2D.r[31] = 32;
}
#endif
break; break;
default: default:

View File

@ -96,13 +96,7 @@ typedef FnType_Void* Fnptr_Void;
#else // must be GCC or Clang #else // must be GCC or Clang
# include <sys/types.h> #include <sys/types.h>
# include <sys/timeb.h>
// Definitions added Feb 16, 2006 by efp
# ifndef __declspec
# define __declspec(x)
# endif
#endif #endif

View File

@ -1017,11 +1017,11 @@ void Pcsx2App::ProgramLog_PostEvent( wxEvent& evt )
static void __concall ConsoleToFile_Newline() static void __concall ConsoleToFile_Newline()
{ {
#ifdef __linux__ #if defined(__unix__)
if ((g_Conf) && (g_Conf->EmuOptions.ConsoleToStdio)) ConsoleWriter_Stdout.Newline(); if ((g_Conf) && (g_Conf->EmuOptions.ConsoleToStdio)) ConsoleWriter_Stdout.Newline();
#endif #endif
#ifdef __linux__ #if defined(__unix__)
fputc( '\n', emuLog ); fputc( '\n', emuLog );
#else #else
fputs( "\r\n", emuLog ); fputs( "\r\n", emuLog );
@ -1030,7 +1030,7 @@ static void __concall ConsoleToFile_Newline()
static void __concall ConsoleToFile_DoWrite( const wxString& fmt ) static void __concall ConsoleToFile_DoWrite( const wxString& fmt )
{ {
#ifdef __linux__ #if defined(__unix__)
if ((g_Conf) && (g_Conf->EmuOptions.ConsoleToStdio)) ConsoleWriter_Stdout.WriteRaw(fmt); if ((g_Conf) && (g_Conf->EmuOptions.ConsoleToStdio)) ConsoleWriter_Stdout.WriteRaw(fmt);
#endif #endif

View File

@ -222,7 +222,7 @@ void GSPanel::OnMouseEvent( wxMouseEvent& evt )
DoShowMouse(); DoShowMouse();
} }
#ifdef __linux__ #if defined(__unix__)
// HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes
// the event before the pad see it. So you send key event directly to the pad. // the event before the pad see it. So you send key event directly to the pad.
if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) {
@ -285,7 +285,7 @@ void GSPanel::OnKeyDownOrUp( wxKeyEvent& evt )
// to the APP level message handler, which in turn routes them right back here -- yes it's // to the APP level message handler, which in turn routes them right back here -- yes it's
// silly, but oh well). // silly, but oh well).
#ifdef __linux__ #if defined(__unix__)
// HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes
// the event before the pad see it. So you send key event directly to the pad. // the event before the pad see it. So you send key event directly to the pad.
if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) {
@ -367,7 +367,7 @@ void GSPanel::OnFocus( wxFocusEvent& evt )
else else
DoShowMouse(); DoShowMouse();
#ifdef __linux__ #if defined(__unix__)
// HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes
// the event before the pad see it. So you send key event directly to the pad. // the event before the pad see it. So you send key event directly to the pad.
if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) {
@ -385,7 +385,7 @@ void GSPanel::OnFocusLost( wxFocusEvent& evt )
evt.Skip(); evt.Skip();
m_HasFocus = false; m_HasFocus = false;
DoShowMouse(); DoShowMouse();
#ifdef __linux__ #if defined(__unix__)
// HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes
// the event before the pad see it. So you send key event directly to the pad. // the event before the pad see it. So you send key event directly to the pad.
if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) { if( (PADWriteEvent != NULL) && (GSopen2 != NULL) ) {

View File

@ -503,7 +503,7 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title)
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
m_menuMisc.Append( &m_MenuItem_Console ); m_menuMisc.Append( &m_MenuItem_Console );
#ifdef __linux__ #if defined(__unix__)
m_menuMisc.Append( &m_MenuItem_Console_Stdio ); m_menuMisc.Append( &m_MenuItem_Console_Stdio );
#endif #endif
//Todo: Though not many people need this one :p //Todo: Though not many people need this one :p
@ -695,7 +695,7 @@ void MainEmuFrame::ApplyConfigToGui(AppConfig& configToApply, int flags)
menubar.Check( MenuId_EnableCheats, configToApply.EmuOptions.EnableCheats ); menubar.Check( MenuId_EnableCheats, configToApply.EmuOptions.EnableCheats );
menubar.Check( MenuId_EnableWideScreenPatches, configToApply.EmuOptions.EnableWideScreenPatches ); menubar.Check( MenuId_EnableWideScreenPatches, configToApply.EmuOptions.EnableWideScreenPatches );
menubar.Check( MenuId_EnableHostFs, configToApply.EmuOptions.HostFs ); menubar.Check( MenuId_EnableHostFs, configToApply.EmuOptions.HostFs );
#ifdef __linux__ #if defined(__unix__)
menubar.Check( MenuId_Console_Stdio, configToApply.EmuOptions.ConsoleToStdio ); menubar.Check( MenuId_Console_Stdio, configToApply.EmuOptions.ConsoleToStdio );
#endif #endif

View File

@ -362,7 +362,7 @@ void i18n_SetLanguagePath()
// default location for windows // default location for windows
wxLocale::AddCatalogLookupPathPrefix( wxGetCwd() ); wxLocale::AddCatalogLookupPathPrefix( wxGetCwd() );
// additional location for linux // additional location for linux
#ifdef __linux__ #ifdef __unix__
wxLocale::AddCatalogLookupPathPrefix( PathDefs::GetLangs().ToString() ); wxLocale::AddCatalogLookupPathPrefix( PathDefs::GetLangs().ToString() );
#endif #endif

View File

@ -1022,7 +1022,7 @@ const GSVector4i GPUDrawScanlineCodeGenerator::m_test[8] =
GSVector4i::zero(), GSVector4i::zero(),
}; };
__aligned(const uint16, 32) GPUDrawScanlineCodeGenerator::m_dither[4][16] = alignas(32) const uint16_t GPUDrawScanlineCodeGenerator::m_dither[4][16] =
{ {
{7, 0, 6, 1, 7, 0, 6, 1, 7, 0, 6, 1, 7, 0, 6, 1}, {7, 0, 6, 1, 7, 0, 6, 1, 7, 0, 6, 1, 7, 0, 6, 1},
{2, 5, 3, 4, 2, 5, 3, 4, 2, 5, 3, 4, 2, 5, 3, 4}, {2, 5, 3, 4, 2, 5, 3, 4, 2, 5, 3, 4, 2, 5, 3, 4},

View File

@ -56,5 +56,5 @@ public:
GPUDrawScanlineCodeGenerator(void* param, uint32 key, void* code, size_t maxsize); GPUDrawScanlineCodeGenerator(void* param, uint32 key, void* code, size_t maxsize);
static const GSVector4i m_test[8]; static const GSVector4i m_test[8];
static __aligned(const uint16, 32) m_dither[4][16]; alignas(32) static const uint16 m_dither[4][16];
}; };

View File

@ -23,7 +23,7 @@
#include "GPU.h" #include "GPU.h"
__aligned(class, 32) GPUDrawingEnvironment class alignas(32) GPUDrawingEnvironment
{ {
public: public:
GPURegSTATUS STATUS; GPURegSTATUS STATUS;

View File

@ -56,7 +56,7 @@ union GPUScanlineSelector
operator uint32() const {return key;} operator uint32() const {return key;}
}; };
__aligned(struct, 32) GPUScanlineGlobalData struct alignas(32) GPUScanlineGlobalData
{ {
GPUScanlineSelector sel; GPUScanlineSelector sel;
@ -66,7 +66,7 @@ __aligned(struct, 32) GPUScanlineGlobalData
GSVector4i twin; // TWW, TWH, TWX, TWY GSVector4i twin; // TWW, TWH, TWX, TWY
}; };
__aligned(struct, 32) GPUScanlineLocalData struct alignas(32) GPUScanlineLocalData
{ {
const GPUScanlineGlobalData* gd; const GPUScanlineGlobalData* gd;

View File

@ -26,7 +26,7 @@
#pragma pack(push, 1) #pragma pack(push, 1)
__aligned(struct, 32) GPUVertex struct alignas(32) GPUVertex
{ {
union union
{ {

View File

@ -365,7 +365,7 @@ static int _GSopen(void** dsp, const char* title, GSRendererType renderer, int t
int w = theApp.GetConfig("ModeWidth", 0); int w = theApp.GetConfig("ModeWidth", 0);
int h = theApp.GetConfig("ModeHeight", 0); int h = theApp.GetConfig("ModeHeight", 0);
#ifdef __linux__ #if defined(__unix__)
for(uint32 i = 0; i < 2; i++) { for(uint32 i = 0; i < 2; i++) {
try try
{ {
@ -408,7 +408,7 @@ static int _GSopen(void** dsp, const char* title, GSRendererType renderer, int t
{ {
s_gs->SetMultithreaded(true); s_gs->SetMultithreaded(true);
#ifdef __linux__ #if defined(__unix__)
if (s_gs->m_wnd) { if (s_gs->m_wnd) {
// A window was already attached to s_gs so we also // A window was already attached to s_gs so we also
// need to restore the window state (Attach) // need to restore the window state (Attach)
@ -510,7 +510,7 @@ EXPORT_C_(int) GSopen2(void** dsp, uint32 flags)
} }
#endif #endif
#ifdef __linux__ #if defined(__unix__)
switch(renderer) { switch(renderer) {
// Use alternative renderer (SW if currently using HW renderer, and vice versa) // Use alternative renderer (SW if currently using HW renderer, and vice versa)
case GSRendererType::OGL_SW: renderer = GSRendererType::OGL_HW; break; case GSRendererType::OGL_SW: renderer = GSRendererType::OGL_HW; break;
@ -882,7 +882,7 @@ EXPORT_C_(int) GSsetupRecording(int start, void* data)
printf("GSdx: no s_gs for recording\n"); printf("GSdx: no s_gs for recording\n");
return 0; return 0;
} }
#ifdef __linux__ #if defined(__unix__)
if (!theApp.GetConfig("capture_enabled", 0)) { if (!theApp.GetConfig("capture_enabled", 0)) {
printf("GSdx: Recording is disabled\n"); printf("GSdx: Recording is disabled\n");
return 0; return 0;
@ -1497,18 +1497,15 @@ EXPORT_C GSBenchmark(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow
#endif #endif
#ifdef __linux__ #if defined(__unix__)
#include <sys/time.h>
#include <sys/timeb.h> // ftime(), struct timeb
#include "GSLzma.h" #include "GSLzma.h"
inline unsigned long timeGetTime() inline unsigned long timeGetTime()
{ {
timeb t; struct timespec t;
ftime(&t); clock_gettime(CLOCK_REALTIME, &t);
return (unsigned long)(t.tv_sec*1000 + t.tv_nsec/1000000);
return (unsigned long)(t.time*1000 + t.millitm);
} }
// Note // Note

View File

@ -1101,7 +1101,7 @@ REG128_SET(GIFPackedReg)
GIFPackedNOP NOP; GIFPackedNOP NOP;
REG_SET_END REG_SET_END
__aligned(struct, 32) GIFPath struct alignas(32) GIFPath
{ {
GIFTag tag; GIFTag tag;
uint32 nloop; uint32 nloop;

View File

@ -1917,7 +1917,7 @@ public:
#else #else
__aligned(uint16, 32) block[16 * 8]; alignas(32) uint16 block[16 * 8];
ReadBlock16(src, (uint8*)block, sizeof(block) / 8); ReadBlock16(src, (uint8*)block, sizeof(block) / 8);
@ -1976,7 +1976,7 @@ public:
#else #else
__aligned(uint8, 32) block[16 * 16]; alignas(32) uint8 block[16 * 16];
ReadBlock8(src, (uint8*)block, sizeof(block) / 16); ReadBlock8(src, (uint8*)block, sizeof(block) / 16);
@ -2053,7 +2053,7 @@ public:
#else #else
__aligned(uint8, 32) block[(32 / 2) * 16]; alignas(32) uint8 block[(32 / 2) * 16];
ReadBlock4(src, (uint8*)block, sizeof(block) / 16); ReadBlock4(src, (uint8*)block, sizeof(block) / 16);
@ -2096,7 +2096,7 @@ public:
#else #else
__aligned(uint32, 32) block[8 * 8]; alignas(32) uint32 block[8 * 8];
ReadBlock32(src, (uint8*)block, sizeof(block) / 8); ReadBlock32(src, (uint8*)block, sizeof(block) / 8);
@ -2139,7 +2139,7 @@ public:
#else #else
__aligned(uint32, 32) block[8 * 8]; alignas(32) uint32 block[8 * 8];
ReadBlock32(src, (uint8*)block, sizeof(block) / 8); ReadBlock32(src, (uint8*)block, sizeof(block) / 8);
@ -2182,7 +2182,7 @@ public:
#else #else
__aligned(uint32, 32) block[8 * 8]; alignas(32) uint32 block[8 * 8];
ReadBlock32(src, (uint8*)block, sizeof(block) / 8); ReadBlock32(src, (uint8*)block, sizeof(block) / 8);

View File

@ -382,7 +382,7 @@ GSCapture::GSCapture()
{ {
m_out_dir = theApp.GetConfig("capture_out_dir", "/tmp/GSdx_Capture"); m_out_dir = theApp.GetConfig("capture_out_dir", "/tmp/GSdx_Capture");
m_threads = theApp.GetConfig("capture_threads", 4); m_threads = theApp.GetConfig("capture_threads", 4);
#ifdef __linux__ #if defined(__unix__)
m_compression_level = theApp.GetConfig("png_compression_level", Z_BEST_SPEED); m_compression_level = theApp.GetConfig("png_compression_level", Z_BEST_SPEED);
#endif #endif
} }
@ -481,7 +481,7 @@ bool GSCapture::BeginCapture(float fps, GSVector2i recomendedResolution, float a
CComQIPtr<IGSSource>(m_src)->DeliverNewSegment(); CComQIPtr<IGSSource>(m_src)->DeliverNewSegment();
#elif __linux__ #elif defined(__unix__)
// Note I think it doesn't support multiple depth creation // Note I think it doesn't support multiple depth creation
GSmkdir(m_out_dir.c_str()); GSmkdir(m_out_dir.c_str());
@ -521,7 +521,7 @@ bool GSCapture::DeliverFrame(const void* bits, int pitch, bool rgba)
return true; return true;
} }
#elif __linux__ #elif defined(__unix__)
std::string out_file = m_out_dir + format("/frame.%010d.png", m_frame); std::string out_file = m_out_dir + format("/frame.%010d.png", m_frame);
//GSPng::Save(GSPng::RGB_PNG, out_file, (uint8*)bits, m_size.x, m_size.y, pitch, m_compression_level); //GSPng::Save(GSPng::RGB_PNG, out_file, (uint8*)bits, m_size.x, m_size.y, pitch, m_compression_level);
@ -554,7 +554,7 @@ bool GSCapture::EndCapture()
m_graph = NULL; m_graph = NULL;
} }
#elif __linux__ #elif defined(__unix__)
for(size_t i = 0; i < m_workers.size(); i++) { for(size_t i = 0; i < m_workers.size(); i++) {
m_workers[i]->Wait(); m_workers[i]->Wait();
} }

View File

@ -42,7 +42,7 @@ class GSCapture
CComPtr<IGraphBuilder> m_graph; CComPtr<IGraphBuilder> m_graph;
CComPtr<IBaseFilter> m_src; CComPtr<IBaseFilter> m_src;
#elif __linux__ #elif defined(__unix__)
vector<GSPng::Worker*> m_workers; vector<GSPng::Worker*> m_workers;
int m_compression_level; int m_compression_level;

View File

@ -28,7 +28,7 @@
class GSLocalMemory; class GSLocalMemory;
__aligned(class, 32) GSClut : public GSAlignedClass<32> class alignas(32) GSClut : public GSAlignedClass<32>
{ {
GSLocalMemory* m_mem; GSLocalMemory* m_mem;
@ -37,7 +37,7 @@ __aligned(class, 32) GSClut : public GSAlignedClass<32>
uint32* m_buff32; uint32* m_buff32;
uint64* m_buff64; uint64* m_buff64;
__aligned(struct, 32) WriteState struct alignas(32) WriteState
{ {
GIFRegTEX0 TEX0; GIFRegTEX0 TEX0;
GIFRegTEXCLUT TEXCLUT; GIFRegTEXCLUT TEXCLUT;
@ -45,7 +45,7 @@ __aligned(class, 32) GSClut : public GSAlignedClass<32>
bool IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT); bool IsDirty(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT);
} m_write; } m_write;
__aligned(struct, 32) ReadState struct alignas(32) ReadState
{ {
GIFRegTEX0 TEX0; GIFRegTEX0 TEX0;
GIFRegTEXA TEXA; GIFRegTEXA TEXA;

View File

@ -30,7 +30,7 @@ class GSDeviceDX : public GSDevice
public: public:
#pragma pack(push, 1) #pragma pack(push, 1)
__aligned(struct, 32) VSConstantBuffer struct alignas(32) VSConstantBuffer
{ {
GSVector4 VertexScale; GSVector4 VertexScale;
GSVector4 VertexOffset; GSVector4 VertexOffset;
@ -86,7 +86,7 @@ public:
VSSelector() : key(0) {} VSSelector() : key(0) {}
}; };
__aligned(struct, 32) PSConstantBuffer struct alignas(32) PSConstantBuffer
{ {
GSVector4 FogColor_AREF; GSVector4 FogColor_AREF;
GSVector4 HalfTexel; GSVector4 HalfTexel;

View File

@ -116,8 +116,8 @@ public:
class GSDeviceOGL final : public GSDevice class GSDeviceOGL final : public GSDevice
{ {
public: public:
__aligned(struct, 32) VSConstantBuffer struct alignas(32) VSConstantBuffer
{ {
GSVector4 Vertex_Scale_Offset; GSVector4 Vertex_Scale_Offset;
GSVector4 TextureScale; GSVector4 TextureScale;
@ -187,7 +187,7 @@ class GSDeviceOGL final : public GSDevice
GSSelector(uint32 k) : key(k) {} GSSelector(uint32 k) : key(k) {}
}; };
__aligned(struct, 32) PSConstantBuffer struct alignas(32) PSConstantBuffer
{ {
GSVector4 FogColor_AREF; GSVector4 FogColor_AREF;
GSVector4 WH; GSVector4 WH;

View File

@ -186,7 +186,7 @@ public:
} }
}; };
__aligned(class, 16) ShaderFactorBlend : public ShaderBase class alignas(16) ShaderFactorBlend : public ShaderBase
{ {
GSVector4i m_f; GSVector4i m_f;

View File

@ -24,7 +24,7 @@
#if _M_SSE >= 0x501 #if _M_SSE >= 0x501
__aligned(const uint8, 8) GSDrawScanlineCodeGenerator::m_test[16][8] = alignas(8) const uint8 GSDrawScanlineCodeGenerator::m_test[16][8] =
{ {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},

View File

@ -135,7 +135,7 @@ public:
GSDrawScanlineCodeGenerator(void* param, uint64 key, void* code, size_t maxsize); GSDrawScanlineCodeGenerator(void* param, uint64 key, void* code, size_t maxsize);
#if _M_SSE >= 0x501 #if _M_SSE >= 0x501
static __aligned(const uint8, 8) m_test[16][8]; alignas(8) static const uint8 m_test[16][8];
static const GSVector8 m_log2_coef[4]; static const GSVector8 m_log2_coef[4];
#else #else
static const GSVector4i m_test[8]; static const GSVector4i m_test[8];

View File

@ -24,7 +24,7 @@
#include "GS.h" #include "GS.h"
#include "GSLocalMemory.h" #include "GSLocalMemory.h"
__aligned(class, 32) GSDrawingContext class alignas(32) GSDrawingContext
{ {
public: public:
GIFRegXYOFFSET XYOFFSET; GIFRegXYOFFSET XYOFFSET;

View File

@ -23,7 +23,7 @@
#include "GS.h" #include "GS.h"
__aligned(class, 32) GSDrawingEnvironment class alignas(32) GSDrawingEnvironment
{ {
public: public:
GIFRegPRIM PRIM; GIFRegPRIM PRIM;

View File

@ -770,7 +770,7 @@ void GSLocalMemory::WriteImageLeftRight(int l, int r, int y, int h, const uint8*
template<int psm, int bsx, int bsy, int trbpp> template<int psm, int bsx, int bsy, int trbpp>
void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const uint8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF) void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const uint8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
{ {
__aligned(uint8, 32) buff[64]; // merge buffer for one column alignas(32) uint8 buff[64]; // merge buffer for one column
uint32 bp = BITBLTBUF.DBP; uint32 bp = BITBLTBUF.DBP;
uint32 bw = BITBLTBUF.DBW; uint32 bw = BITBLTBUF.DBW;
@ -2055,7 +2055,7 @@ uint32* GSOffset::GetPages(const GSVector4i& rect, uint32* pages, GSVector4i* bb
pages = new uint32[limit]; pages = new uint32[limit];
} }
__aligned(uint32, 16) tmp[16]; alignas(16) uint32 tmp[16];
((GSVector4i*)tmp)[0] = GSVector4i::zero(); ((GSVector4i*)tmp)[0] = GSVector4i::zero();
((GSVector4i*)tmp)[1] = GSVector4i::zero(); ((GSVector4i*)tmp)[1] = GSVector4i::zero();

View File

@ -30,13 +30,13 @@
class GSOffset : public GSAlignedClass<32> class GSOffset : public GSAlignedClass<32>
{ {
public: public:
__aligned(struct, 32) Block struct alignas(32) Block
{ {
short row[256]; // yn (n = 0 8 16 ...) short row[256]; // yn (n = 0 8 16 ...)
short* col; // blockOffset* short* col; // blockOffset*
}; };
__aligned(struct, 32) Pixel struct alignas(32) Pixel
{ {
int row[4096]; // yn (n = 0 1 2 ...) NOTE: this wraps around above 2048, only transfers should address the upper half (dark cloud 2 inventing) int row[4096]; // yn (n = 0 1 2 ...) NOTE: this wraps around above 2048, only transfers should address the upper half (dark cloud 2 inventing)
int* col[8]; // rowOffset* int* col[8]; // rowOffset*
@ -95,7 +95,7 @@ public:
typedef void (GSLocalMemory::*readTexture)(const GSOffset* RESTRICT off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA); typedef void (GSLocalMemory::*readTexture)(const GSOffset* RESTRICT off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA);
typedef void (GSLocalMemory::*readTextureBlock)(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const; typedef void (GSLocalMemory::*readTextureBlock)(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const;
__aligned(struct, 128) psm_t struct alignas(128) psm_t
{ {
pixelAddress pa, bn; pixelAddress pa, bn;
readPixel rp; readPixel rp;

View File

@ -21,7 +21,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "GSLzma.h" #include "GSLzma.h"
#ifdef __linux__ #if defined(__unix__)
GSDumpFile::GSDumpFile(char* filename) { GSDumpFile::GSDumpFile(char* filename) {
m_fp = fopen(filename, "rb"); m_fp = fopen(filename, "rb");

View File

@ -18,7 +18,7 @@
* *
*/ */
#ifdef __linux__ #if defined(__unix__)
#ifdef LZMA_SUPPORTED #ifdef LZMA_SUPPORTED
#include <lzma.h> #include <lzma.h>

View File

@ -38,7 +38,7 @@ void GSPerfMon::Put(counter_t c, double val)
#ifndef DISABLE_PERF_MON #ifndef DISABLE_PERF_MON
if(c == Frame) if(c == Frame)
{ {
#ifdef __linux__ #if defined(__unix__)
// clock on linux will return CLOCK_PROCESS_CPUTIME_ID. // clock on linux will return CLOCK_PROCESS_CPUTIME_ID.
// CLOCK_THREAD_CPUTIME_ID is much more useful to measure the fps // CLOCK_THREAD_CPUTIME_ID is much more useful to measure the fps
struct timespec ts; struct timespec ts;

View File

@ -28,7 +28,7 @@
#include "GSPerfMon.h" #include "GSPerfMon.h"
#include "GSThread_CXX11.h" #include "GSThread_CXX11.h"
__aligned(class, 32) GSRasterizerData : public GSAlignedClass<32> class alignas(32) GSRasterizerData : public GSAlignedClass<32>
{ {
static int s_counter; static int s_counter;
@ -122,7 +122,7 @@ public:
virtual void PrintStats() = 0; virtual void PrintStats() = 0;
}; };
__aligned(class, 32) GSRasterizer : public IRasterizer class alignas(32) GSRasterizer : public IRasterizer
{ {
protected: protected:
GSPerfMon* m_perfmon; GSPerfMon* m_perfmon;

View File

@ -21,7 +21,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "GSRenderer.h" #include "GSRenderer.h"
#ifdef __linux__ #if defined(__unix__)
#include <X11/keysym.h> #include <X11/keysym.h>
#endif #endif
@ -585,7 +585,7 @@ void GSRenderer::KeyEvent(GSKeyEventData* e)
} }
} }
#elif defined(__linux__) #elif defined(__unix__)
if(e->type == KEYPRESS) if(e->type == KEYPRESS)
{ {
int step = m_shift_key ? -1 : 1; int step = m_shift_key ? -1 : 1;

View File

@ -25,7 +25,7 @@
#ifdef ENABLE_OPENCL #ifdef ENABLE_OPENCL
__aligned(struct, 32) GSVertexCL struct alignas(32) GSVertexCL
{ {
GSVector4 p, t; GSVector4 p, t;
}; };
@ -145,7 +145,7 @@ class GSRendererCL : public GSRenderer
} }
}; };
__aligned(struct, 32) TFXParameter struct alignas(32) TFXParameter
{ {
GSVector4i scissor; GSVector4i scissor;
GSVector4i dimx; // 4x4 signed char GSVector4i dimx; // 4x4 signed char

View File

@ -44,7 +44,7 @@ class GSRendererCS : public GSRenderer
VSSelector() : key(0) {} VSSelector() : key(0) {}
}; };
__aligned(struct, 32) VSConstantBuffer struct alignas(32) VSConstantBuffer
{ {
GSVector4 VertexScale; GSVector4 VertexScale;
GSVector4 VertexOffset; GSVector4 VertexOffset;
@ -86,7 +86,7 @@ class GSRendererCS : public GSRenderer
PSSelector() : key(0) {} PSSelector() : key(0) {}
}; };
__aligned(struct, 32) PSConstantBuffer struct alignas(32) PSConstantBuffer
{ {
uint32 fm; uint32 fm;
uint32 zm; uint32 zm;

View File

@ -29,7 +29,7 @@ class GSRendererSW : public GSRenderer
{ {
class SharedData : public GSDrawScanline::SharedData class SharedData : public GSDrawScanline::SharedData
{ {
__aligned(struct, 16) TextureLevel struct alignas(16) TextureLevel
{ {
GSVector4i r; GSVector4i r;
GSTextureCacheSW::Texture* t; GSTextureCacheSW::Texture* t;

View File

@ -105,7 +105,7 @@ union GSScanlineSelector
} }
}; };
__aligned(struct, 32) GSScanlineGlobalData // per batch variables, this is like a pixel shader constant buffer struct alignas(32) GSScanlineGlobalData // per batch variables, this is like a pixel shader constant buffer
{ {
GSScanlineSelector sel; GSScanlineSelector sel;
@ -150,7 +150,7 @@ __aligned(struct, 32) GSScanlineGlobalData // per batch variables, this is like
#endif #endif
}; };
__aligned(struct, 32) GSScanlineLocalData // per prim variables, each thread has its own struct alignas(32) GSScanlineLocalData // per prim variables, each thread has its own
{ {
#if _M_SSE >= 0x501 #if _M_SSE >= 0x501

View File

@ -21,7 +21,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "GSSetting.h" #include "GSSetting.h"
#ifndef __linux__ #ifdef _WIN32
#include "resource.h" #include "resource.h"
#endif #endif

View File

@ -40,7 +40,7 @@ struct GSSetting
const char* dialog_message(int ID, bool* updateText = NULL); const char* dialog_message(int ID, bool* updateText = NULL);
#ifdef __linux__ #ifndef _WIN32
enum { enum {
IDC_FILTER, IDC_FILTER,
IDC_SKIPDRAWHACK, IDC_SKIPDRAWHACK,

View File

@ -56,7 +56,7 @@ GSState::GSState()
s_savef = !!theApp.GetConfig("savef", 0); s_savef = !!theApp.GetConfig("savef", 0);
s_saven = theApp.GetConfig("saven", 0); s_saven = theApp.GetConfig("saven", 0);
s_savel = theApp.GetConfig("savel", 5000); s_savel = theApp.GetConfig("savel", 5000);
#ifdef __linux__ #if defined(__unix__)
if (s_dump) { if (s_dump) {
GSmkdir("/tmp/GS_HW_dump"); GSmkdir("/tmp/GS_HW_dump");
GSmkdir("/tmp/GS_SW_dump"); GSmkdir("/tmp/GS_SW_dump");

View File

@ -65,6 +65,6 @@ public:
#endif #endif
}; };
#ifdef __linux__ #if defined(__unix__)
void GSmkdir(const char* dir); void GSmkdir(const char* dir);
#endif #endif

View File

@ -90,7 +90,7 @@ class GSVector8i;
#endif #endif
__aligned(class, 16) GSVector4i class alignas(16) GSVector4i
{ {
static const GSVector4i m_xff[17]; static const GSVector4i m_xff[17];
static const GSVector4i m_x0f[17]; static const GSVector4i m_x0f[17];
@ -2421,7 +2421,7 @@ public:
__forceinline static GSVector4i x0f(int n) {return m_x0f[n];} __forceinline static GSVector4i x0f(int n) {return m_x0f[n];}
}; };
__aligned(class, 16) GSVector4 class alignas(16) GSVector4
{ {
public: public:
union union
@ -3341,7 +3341,7 @@ GSVector.h:2973:15: error: shadows template parm 'int i'
#if _M_SSE >= 0x501 #if _M_SSE >= 0x501
__aligned(class, 32) GSVector8i class alignas(32) GSVector8i
{ {
static const GSVector8i m_xff[33]; static const GSVector8i m_xff[33];
static const GSVector8i m_x0f[33]; static const GSVector8i m_x0f[33];
@ -5133,7 +5133,7 @@ public:
#if _M_SSE >= 0x500 #if _M_SSE >= 0x500
__aligned(class, 32) GSVector8 class alignas(32) GSVector8
{ {
public: public:
union union

View File

@ -28,7 +28,7 @@
#pragma pack(push, 1) #pragma pack(push, 1)
__aligned(struct, 32) GSVertex struct alignas(32) GSVertex
{ {
union union
{ {
@ -52,7 +52,7 @@ struct GSVertexP
GSVector4 p; GSVector4 p;
}; };
__aligned(struct, 32) GSVertexPT1 struct alignas(32) GSVertexPT1
{ {
GSVector4 p; GSVector4 p;
GSVector2 t; GSVector2 t;

View File

@ -26,7 +26,7 @@
#pragma pack(push, 1) #pragma pack(push, 1)
__aligned(struct, 32) GSVertexHW9 struct alignas(32) GSVertexHW9
{ {
GSVector4 t; GSVector4 t;
GSVector4 p; GSVector4 p;

View File

@ -23,7 +23,7 @@
#include "GSVector.h" #include "GSVector.h"
__aligned(struct, 32) GSVertexSW struct alignas(32) GSVertexSW
{ {
GSVector4 p, _pad, t, c; GSVector4 p, _pad, t, c;
@ -237,7 +237,7 @@ __aligned(struct, 32) GSVertexSW
#if _M_SSE >= 0x501 #if _M_SSE >= 0x501
__aligned(struct, 32) GSVertexSW2 struct alignas(32) GSVertexSW2
{ {
GSVector4 p, _pad; GSVector4 p, _pad;
GSVector8 tc; GSVector8 tc;

View File

@ -29,7 +29,7 @@
class GSState; class GSState;
__aligned(class, 32) GSVertexTrace : public GSAlignedClass<32> class alignas(32) GSVertexTrace : public GSAlignedClass<32>
{ {
public: public:
struct Vertex {GSVector4i c; GSVector4 p, t;}; struct Vertex {GSVector4i c; GSVector4 p, t;};

View File

@ -22,7 +22,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "GSWndEGL.h" #include "GSWndEGL.h"
#if defined(__linux__) && defined(EGL_SUPPORTED) #if defined(__unix__) && defined(EGL_SUPPORTED)
GSWndEGL::GSWndEGL() GSWndEGL::GSWndEGL()
: m_NativeWindow(0), m_NativeDisplay(NULL) : m_NativeWindow(0), m_NativeDisplay(NULL)

View File

@ -21,7 +21,7 @@
#include "GSWnd.h" #include "GSWnd.h"
#if defined(__linux__) && defined(EGL_SUPPORTED) #if defined(__unix__) && defined(EGL_SUPPORTED)
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <EGL/egl.h> #include <EGL/egl.h>
#include <EGL/eglext.h> #include <EGL/eglext.h>

View File

@ -22,7 +22,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "GSWndOGL.h" #include "GSWndOGL.h"
#if defined(__linux__) #if defined(__unix__)
GSWndOGL::GSWndOGL() GSWndOGL::GSWndOGL()
: m_NativeWindow(0), m_NativeDisplay(NULL), m_context(0), m_swapinterval(NULL) : m_NativeWindow(0), m_NativeDisplay(NULL), m_context(0), m_swapinterval(NULL)
{ {

View File

@ -21,7 +21,7 @@
#include "GSWnd.h" #include "GSWnd.h"
#if defined(__linux__) #if defined(__unix__)
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <GL/glx.h> #include <GL/glx.h>

View File

@ -172,7 +172,7 @@ GSdxApp::GSdxApp()
m_gs_upscale_multiplier.push_back(GSSetting(5, "5x Native", "")); m_gs_upscale_multiplier.push_back(GSSetting(5, "5x Native", ""));
m_gs_upscale_multiplier.push_back(GSSetting(6, "6x Native", "")); m_gs_upscale_multiplier.push_back(GSSetting(6, "6x Native", ""));
m_gs_upscale_multiplier.push_back(GSSetting(8, "8x Native", "")); m_gs_upscale_multiplier.push_back(GSSetting(8, "8x Native", ""));
#ifndef __linux__ #ifndef __unix__
m_gs_upscale_multiplier.push_back(GSSetting(0, "Custom", "")); m_gs_upscale_multiplier.push_back(GSSetting(0, "Custom", ""));
#endif #endif
@ -237,7 +237,7 @@ GSdxApp::GSdxApp()
m_gpu_scale.push_back(GSSetting(2 | (2 << 2), "H x 4 - V x 4", "")); m_gpu_scale.push_back(GSSetting(2 | (2 << 2), "H x 4 - V x 4", ""));
} }
#ifdef __linux__ #if defined(__unix__)
void GSdxApp::ReloadConfig() void GSdxApp::ReloadConfig()
{ {
if (m_configuration_map.empty()) return; if (m_configuration_map.empty()) return;

View File

@ -27,7 +27,7 @@ class GSdxApp
{ {
std::string m_ini; std::string m_ini;
std::string m_section; std::string m_section;
#ifdef __linux__ #if defined(__unix__)
std::map< std::string, std::string > m_configuration_map; std::map< std::string, std::string > m_configuration_map;
#endif #endif
@ -40,7 +40,7 @@ public:
HMODULE GetModuleHandle() {return (HMODULE)GetModuleHandlePtr();} HMODULE GetModuleHandle() {return (HMODULE)GetModuleHandlePtr();}
#endif #endif
#ifdef __linux__ #if defined(__unix__)
void BuildConfigurationMap(const char* lpFileName); void BuildConfigurationMap(const char* lpFileName);
void ReloadConfig(); void ReloadConfig();

View File

@ -45,7 +45,7 @@
//#define ENABLE_OGL_DEBUG_MEM_BW // compute the quantity of data transfered (debug purpose) //#define ENABLE_OGL_DEBUG_MEM_BW // compute the quantity of data transfered (debug purpose)
#endif #endif
#if defined(__linux__) && !(defined(_DEBUG) || defined(_DEVEL)) #if defined(__unix__) && !(defined(_DEBUG) || defined(_DEVEL))
#define DISABLE_PERF_MON // Burn cycle for nothing in release mode #define DISABLE_PERF_MON // Burn cycle for nothing in release mode
#endif #endif

View File

@ -197,18 +197,20 @@ using namespace stdext;
#endif #endif
#ifdef _MSC_VER #ifdef _MSC_VER
#if _MSC_VER < 1900
#define __aligned(t, n) __declspec(align(n)) t #define alignas(n) __declspec(align(n))
#endif
#define EXPORT_C_(type) extern "C" __declspec(dllexport) type __stdcall #define EXPORT_C_(type) extern "C" __declspec(dllexport) type __stdcall
#define EXPORT_C EXPORT_C_(void) #define EXPORT_C EXPORT_C_(void)
#define ALIGN_STACK(n) __aligned(int, n) __dummy; #define ALIGN_STACK(n) alignas(n) int dummy__;
#else #else
#define __aligned(t, n) t __attribute__((aligned(n))) #ifndef __fastcall
#define __fastcall __attribute__((fastcall)) #define __fastcall __attribute__((fastcall))
#endif
#define EXPORT_C_(type) extern "C" __attribute__((stdcall,externally_visible,visibility("default"))) type #define EXPORT_C_(type) extern "C" __attribute__((stdcall,externally_visible,visibility("default"))) type
#define EXPORT_C EXPORT_C_(void) #define EXPORT_C EXPORT_C_(void)
@ -227,7 +229,7 @@ using namespace stdext;
#else #else
// TODO Check clang behavior // TODO Check clang behavior
#define ALIGN_STACK(n) __aligned(int, n) __dummy; #define ALIGN_STACK(n) alignas(n) int dummy__;
#endif #endif

View File

@ -21,11 +21,7 @@
#pragma once #pragma once
#include <string.h> // for memset #include <string.h> // for memset
#ifdef __linux__
#define MAX_KEYS 24 #define MAX_KEYS 24
#else
#define MAX_KEYS 20
#endif
enum KeyType enum KeyType
{ {

View File

@ -28,7 +28,7 @@
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
#include "keyboard.h" #include "keyboard.h"
#ifndef __linux__ #ifdef _WIN32
char* KeysymToChar(int keysym) char* KeysymToChar(int keysym)
{ {
LPWORD temp; LPWORD temp;
@ -40,7 +40,7 @@ char* KeysymToChar(int keysym)
void SetAutoRepeat(bool autorep) void SetAutoRepeat(bool autorep)
{ {
#ifdef __linux__ #if defined(__unix__)
if (toggleAutoRepeat) if (toggleAutoRepeat)
{ {
if (autorep) if (autorep)
@ -51,7 +51,7 @@ void SetAutoRepeat(bool autorep)
#endif #endif
} }
#ifdef __linux__ #if defined(__unix__)
static bool s_grab_input = false; static bool s_grab_input = false;
static bool s_Shift = false; static bool s_Shift = false;
static unsigned int s_previous_mouse_x = 0; static unsigned int s_previous_mouse_x = 0;

View File

@ -24,7 +24,7 @@
#include "onepad.h" #include "onepad.h"
#ifdef __linux__ #if defined(__unix__)
#include "Linux/linux.h" #include "Linux/linux.h"

View File

@ -263,7 +263,7 @@ EXPORT_C_(s32) PADopen(void *pDsp)
pthread_spin_init(&mutex_KeyEvent, PTHREAD_PROCESS_PRIVATE); pthread_spin_init(&mutex_KeyEvent, PTHREAD_PROCESS_PRIVATE);
mutex_WasInit = true; mutex_WasInit = true;
#ifdef __linux__ #if defined(__unix__)
GamePad::EnumerateGamePads(s_vgamePad); GamePad::EnumerateGamePads(s_vgamePad);
#endif #endif
return _PADopen(pDsp); return _PADopen(pDsp);
@ -595,7 +595,7 @@ EXPORT_C_(keyEvent*) PADkeyEvent()
return &s_event; return &s_event;
} }
#ifdef __linux__ #if defined(__unix__)
EXPORT_C_(void) PADWriteEvent(keyEvent &evt) EXPORT_C_(void) PADWriteEvent(keyEvent &evt)
{ {
// This function call be called before PADopen. Therefore we cann't // This function call be called before PADopen. Therefore we cann't

View File

@ -49,7 +49,7 @@ using namespace std;
#define PADdefs #define PADdefs
#include "PS2Edefs.h" #include "PS2Edefs.h"
#ifdef __linux__ #if defined(__unix__)
#include "GamePad.h" #include "GamePad.h"
#endif #endif
#include "bitwise.h" #include "bitwise.h"

View File

@ -19,8 +19,10 @@
#include "Dialogs.h" #include "Dialogs.h"
#include "Config.h" #include "Config.h"
#ifdef __linux__
#include <SDL.h> #include <SDL.h>
#include <SDL_audio.h> #include <SDL_audio.h>
#endif
#ifdef PCSX2_DEVBUILD #ifdef PCSX2_DEVBUILD
static const int LATENCY_MAX = 3000; static const int LATENCY_MAX = 3000;
@ -121,12 +123,20 @@ void ReadSettings()
OutputModule = FindOutputModuleById( temp.c_str() );// find the driver index of this module OutputModule = FindOutputModuleById( temp.c_str() );// find the driver index of this module
// find current API // find current API
#ifdef __linux__
CfgReadStr( L"PORTAUDIO", L"HostApi", temp, L"ALSA" ); CfgReadStr( L"PORTAUDIO", L"HostApi", temp, L"ALSA" );
OutputAPI = -1; OutputAPI = -1;
if (temp == L"ALSA") OutputAPI = 0; if (temp == L"ALSA") OutputAPI = 0;
if (temp == L"OSS") OutputAPI = 1; if (temp == L"OSS") OutputAPI = 1;
if (temp == L"JACK") OutputAPI = 2; if (temp == L"JACK") OutputAPI = 2;
#else
CfgReadStr( L"PORTAUDIO", L"HostApi", temp, L"OSS" );
OutputAPI = -1;
if (temp == L"OSS") OutputAPI = 0;
#endif
#ifdef __linux__
CfgReadStr( L"SDL", L"HostApi", temp, L"pulseaudio" ); CfgReadStr( L"SDL", L"HostApi", temp, L"pulseaudio" );
SdlOutputAPI = -1; SdlOutputAPI = -1;
#if SDL_MAJOR_VERSION >= 2 #if SDL_MAJOR_VERSION >= 2
@ -135,13 +145,14 @@ void ReadSettings()
if (!temp.Cmp(wxString(SDL_GetAudioDriver(i), wxConvUTF8))) if (!temp.Cmp(wxString(SDL_GetAudioDriver(i), wxConvUTF8)))
SdlOutputAPI = i; SdlOutputAPI = i;
} }
#endif
#endif #endif
SndOutLatencyMS = CfgReadInt(L"OUTPUT",L"Latency", 300); SndOutLatencyMS = CfgReadInt(L"OUTPUT",L"Latency", 300);
SynchMode = CfgReadInt( L"OUTPUT", L"Synch_Mode", 0); SynchMode = CfgReadInt( L"OUTPUT", L"Synch_Mode", 0);
PortaudioOut->ReadSettings(); PortaudioOut->ReadSettings();
#ifndef __APPLE__ #ifdef __linux__
SDLOut->ReadSettings(); SDLOut->ReadSettings();
#endif #endif
SoundtouchCfg::ReadSettings(); SoundtouchCfg::ReadSettings();
@ -187,7 +198,7 @@ void WriteSettings()
CfgWriteInt(L"DEBUG", L"DelayCycles", delayCycles); CfgWriteInt(L"DEBUG", L"DelayCycles", delayCycles);
PortaudioOut->WriteSettings(); PortaudioOut->WriteSettings();
#ifndef __APPLE__ #ifdef __linux__
SDLOut->WriteSettings(); SDLOut->WriteSettings();
#endif #endif
SoundtouchCfg::WriteSettings(); SoundtouchCfg::WriteSettings();
@ -204,7 +215,7 @@ void debug_dialog()
DebugConfig::DisplayDialog(); DebugConfig::DisplayDialog();
} }
#ifdef __linux__ #if defined(__unix__)
void DisplayDialog() void DisplayDialog()
{ {
int return_value; int return_value;
@ -257,16 +268,22 @@ void DisplayDialog()
mod_box = gtk_combo_box_text_new (); mod_box = gtk_combo_box_text_new ();
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "0 - No Sound (emulate SPU2 only)"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "0 - No Sound (emulate SPU2 only)");
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "1 - PortAudio (cross-platform)"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "1 - PortAudio (cross-platform)");
#ifdef __linux__
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "2 - SDL Audio (recommended for PulseAudio)"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "2 - SDL Audio (recommended for PulseAudio)");
#endif
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "3 - Alsa (probably doesn't work)"); //gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mod_box), "3 - Alsa (probably doesn't work)");
gtk_combo_box_set_active(GTK_COMBO_BOX(mod_box), OutputModule); gtk_combo_box_set_active(GTK_COMBO_BOX(mod_box), OutputModule);
api_label = gtk_label_new ("PortAudio API:"); api_label = gtk_label_new ("PortAudio API:");
api_box = gtk_combo_box_text_new (); api_box = gtk_combo_box_text_new ();
#ifdef __linux__
// In order to keep it the menu light, I only put linux major api // In order to keep it the menu light, I only put linux major api
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "0 - ALSA (recommended)"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "0 - ALSA (recommended)");
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "1 - OSS (legacy)"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "1 - OSS (legacy)");
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "2 - JACK"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "2 - JACK");
#else
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(api_box), "OSS");
#endif
gtk_combo_box_set_active(GTK_COMBO_BOX(api_box), OutputAPI); gtk_combo_box_set_active(GTK_COMBO_BOX(api_box), OutputAPI);
#if SDL_MAJOR_VERSION >= 2 #if SDL_MAJOR_VERSION >= 2
@ -360,12 +377,19 @@ void DisplayDialog()
if (gtk_combo_box_get_active(GTK_COMBO_BOX(api_box)) != -1) { if (gtk_combo_box_get_active(GTK_COMBO_BOX(api_box)) != -1) {
OutputAPI = gtk_combo_box_get_active(GTK_COMBO_BOX(api_box)); OutputAPI = gtk_combo_box_get_active(GTK_COMBO_BOX(api_box));
#ifdef __linux__
switch(OutputAPI) { switch(OutputAPI) {
case 0: PortaudioOut->SetApiSettings(L"ALSA"); break; case 0: PortaudioOut->SetApiSettings(L"ALSA"); break;
case 1: PortaudioOut->SetApiSettings(L"OSS"); break; case 1: PortaudioOut->SetApiSettings(L"OSS"); break;
case 2: PortaudioOut->SetApiSettings(L"JACK"); break; case 2: PortaudioOut->SetApiSettings(L"JACK"); break;
default: PortaudioOut->SetApiSettings(L"Unknown"); default: PortaudioOut->SetApiSettings(L"Unknown");
} }
#else
switch(OutputAPI) {
case 0: PortaudioOut->SetApiSettings(L"OSS"); break;
default: PortaudioOut->SetApiSettings(L"Unknown");
}
#endif
} }
#if SDL_MAJOR_VERSION >= 2 #if SDL_MAJOR_VERSION >= 2

View File

@ -18,7 +18,7 @@
#ifndef CONFIG_H_INCLUDED #ifndef CONFIG_H_INCLUDED
#define CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED
#ifdef __linux__ #if defined(__unix__)
#include <gtk/gtk.h> #include <gtk/gtk.h>
#endif #endif

View File

@ -154,7 +154,7 @@ void WriteSettings()
} }
#ifdef __linux__ #ifdef __unix__
void DisplayDialog() void DisplayDialog()
{ {
GtkWidget *dialog; GtkWidget *dialog;

View File

@ -71,7 +71,7 @@ namespace SoundtouchCfg
CfgWriteInt( L"SOUNDTOUCH", L"OverlapMS", OverlapMS ); CfgWriteInt( L"SOUNDTOUCH", L"OverlapMS", OverlapMS );
} }
#ifdef __linux__ #ifdef __unix__
static GtkWidget *seq_label, *seek_label, *over_label; static GtkWidget *seq_label, *seek_label, *over_label;
static GtkWidget *seq_slide, *seek_slide, *over_slide; static GtkWidget *seq_slide, *seek_slide, *over_slide;

View File

@ -20,7 +20,7 @@
#include "Dialogs.h" #include "Dialogs.h"
#include <cstring> #include <cstring>
#ifdef __linux__ #if defined(__unix__)
#include <gtk/gtk.h> #include <gtk/gtk.h>
void SysMessage(const char *fmt, ...) void SysMessage(const char *fmt, ...)