This commit is contained in:
Christoph Oelckers 2015-12-29 15:22:38 +01:00
commit 9297c60ecd
7 changed files with 65 additions and 10 deletions

View File

@ -450,6 +450,22 @@ else( SSE_MATTERS )
set( BACKPATCH 0 ) set( BACKPATCH 0 )
endif( SSE_MATTERS ) endif( SSE_MATTERS )
if( X64 )
set( HAVE_MMX 1 )
else( X64 )
set( SAFE_CMAKE_C_FLAGS ${CMAKE_C_FLAGS} )
if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmmx")
endif( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
CHECK_CXX_SOURCE_COMPILES("#include <mmintrin.h>
int main(void) { __m64 v = _m_from_int(0); }"
HAVE_MMX)
set( CMAKE_C_FLAGS ${SAFE_CMAKE_C_FLAGS} )
endif( X64 )
# Set up flags for GCC # Set up flags for GCC
if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
@ -582,10 +598,6 @@ endif( NOT DYN_FLUIDSYNTH )
# Start defining source files for ZDoom # Start defining source files for ZDoom
set( PLAT_WIN32_SOURCES set( PLAT_WIN32_SOURCES
gl/hqnx_asm/hq2x_asm.cpp
gl/hqnx_asm/hq3x_asm.cpp
gl/hqnx_asm/hq4x_asm.cpp
gl/hqnx_asm/hqnx_asm_Image.cpp
win32/eaxedit.cpp win32/eaxedit.cpp
win32/fb_d3d9.cpp win32/fb_d3d9.cpp
win32/fb_d3d9_wipe.cpp win32/fb_d3d9_wipe.cpp
@ -669,6 +681,25 @@ else( WIN32 )
set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_OSX_SOURCES} ${PLAT_COCOA_SOURCES} ) set( OTHER_SYSTEM_SOURCES ${PLAT_WIN32_SOURCES} ${PLAT_OSX_SOURCES} ${PLAT_COCOA_SOURCES} )
endif( WIN32 ) endif( WIN32 )
if( HAVE_MMX )
add_definitions( -DHAVE_MMX=1 )
set( SYSTEM_SOURCES ${SYSTEM_SOURCES}
gl/hqnx_asm/hq2x_asm.cpp
gl/hqnx_asm/hq3x_asm.cpp
gl/hqnx_asm/hq4x_asm.cpp
gl/hqnx_asm/hqnx_asm_Image.cpp)
if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
set_source_files_properties(
gl/hqnx_asm/hq2x_asm.cpp
gl/hqnx_asm/hq3x_asm.cpp
gl/hqnx_asm/hq4x_asm.cpp
gl/textures/gl_hqresize.cpp
PROPERTIES COMPILE_FLAGS "-mmmx" )
endif( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
endif( HAVE_MMX )
if( NOT ASM_SOURCES ) if( NOT ASM_SOURCES )
set( ASM_SOURCES "" ) set( ASM_SOURCES "" )
endif( NOT ASM_SOURCES ) endif( NOT ASM_SOURCES )

View File

@ -21,7 +21,9 @@
#ifndef __HQNX_H__ #ifndef __HQNX_H__
#define __HQNX_H__ #define __HQNX_H__
#ifdef _MSC_VER
#pragma warning(disable:4799) #pragma warning(disable:4799)
#endif // _MSC_VER
#include "hqnx_asm_Image.h" #include "hqnx_asm_Image.h"

View File

@ -24,7 +24,9 @@
#include <stdio.h> #include <stdio.h>
#pragma once #pragma once
#ifdef _MSC_VER
#pragma warning(disable: 4103) #pragma warning(disable: 4103)
#endif // _MSC_VER
#pragma pack(1) #pragma pack(1)
namespace HQnX_asm namespace HQnX_asm

View File

@ -57,4 +57,18 @@ CUSTOM_CVAR (Float, vid_contrast, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
// when they are actually valid. // when they are actually valid.
void gl_SetupMenu() void gl_SetupMenu()
{ {
#ifndef HAVE_MMX
FOptionValues **opt = OptionValues.CheckKey("HqResizeModes");
if (opt != NULL)
{
for(int i = (*opt)->mValues.Size()-1; i>=0; i--)
{
// Delete HQnX resize modes for non MSVC targets
if ((*opt)->mValues[i].Value >= 7.0)
{
(*opt)->mValues.Delete(i);
}
}
}
#endif
} }

View File

@ -40,13 +40,17 @@
#include "gl/textures/gl_texture.h" #include "gl/textures/gl_texture.h"
#include "c_cvars.h" #include "c_cvars.h"
#include "gl/hqnx/hqx.h" #include "gl/hqnx/hqx.h"
#ifdef _MSC_VER #ifdef HAVE_MMX
#include "gl/hqnx_asm/hqnx_asm.h" #include "gl/hqnx_asm/hqnx_asm.h"
#endif #endif
CUSTOM_CVAR(Int, gl_texture_hqresize, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) CUSTOM_CVAR(Int, gl_texture_hqresize, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL)
{ {
#ifdef HAVE_MMX
if (self < 0 || self > 9)
#else
if (self < 0 || self > 6) if (self < 0 || self > 6)
#endif
self = 0; self = 0;
GLRenderer->FlushTextures(); GLRenderer->FlushTextures();
} }
@ -182,8 +186,7 @@ static unsigned char *scaleNxHelper( void (*scaleNxFunction) ( uint32* , uint32*
return newBuffer; return newBuffer;
} }
// [BB] hqnx scaling is only supported with the MS compiler. #ifdef HAVE_MMX
#ifdef _MSC_VER
static unsigned char *hqNxAsmHelper( void (*hqNxFunction) ( int*, unsigned char*, int, int, int ), static unsigned char *hqNxAsmHelper( void (*hqNxFunction) ( int*, unsigned char*, int, int, int ),
const int N, const int N,
unsigned char *inputBuffer, unsigned char *inputBuffer,
@ -281,7 +284,7 @@ unsigned char *gl_CreateUpsampledTextureBuffer ( const FTexture *inputTexture, u
outWidth = inWidth; outWidth = inWidth;
outHeight = inHeight; outHeight = inHeight;
int type = gl_texture_hqresize; int type = gl_texture_hqresize;
#ifdef _MSC_VER #ifdef HAVE_MMX
// ASM-hqNx does not preserve the alpha channel so fall back to C-version for such textures // ASM-hqNx does not preserve the alpha channel so fall back to C-version for such textures
if (!hasAlpha && type > 3 && type <= 6) if (!hasAlpha && type > 3 && type <= 6)
{ {
@ -303,7 +306,7 @@ unsigned char *gl_CreateUpsampledTextureBuffer ( const FTexture *inputTexture, u
return hqNxHelper( &hq3x_32, 3, inputBuffer, inWidth, inHeight, outWidth, outHeight ); return hqNxHelper( &hq3x_32, 3, inputBuffer, inWidth, inHeight, outWidth, outHeight );
case 6: case 6:
return hqNxHelper( &hq4x_32, 4, inputBuffer, inWidth, inHeight, outWidth, outHeight ); return hqNxHelper( &hq4x_32, 4, inputBuffer, inWidth, inHeight, outWidth, outHeight );
#ifdef _MSC_VER #ifdef HAVE_MMX
case 7: case 7:
return hqNxAsmHelper( &HQnX_asm::hq2x_32, 2, inputBuffer, inWidth, inHeight, outWidth, outHeight ); return hqNxAsmHelper( &HQnX_asm::hq2x_32, 2, inputBuffer, inWidth, inHeight, outWidth, outHeight );
case 8: case 8:

View File

@ -1239,7 +1239,7 @@ void FTextureManager::PrecacheLevel (void)
if (demoplayback) if (demoplayback)
return; return;
precacheTime = I_MSTime(); precacheTime = I_FPSTime();
hitlist = new BYTE[cnt]; hitlist = new BYTE[cnt];
memset (hitlist, 0, cnt); memset (hitlist, 0, cnt);

View File

@ -103,6 +103,9 @@ OptionValue "HqResizeModes"
4, "hq2x" 4, "hq2x"
5, "hq3x" 5, "hq3x"
6, "hq4x" 6, "hq4x"
7, "hq2x MMX"
8, "hq3x MMX"
9, "hq4x MMX"
} }
OptionValue "FogMode" OptionValue "FogMode"