Merge branch 'master' of git://github.com/snes9xgit/snes9x

This commit is contained in:
gocha 2011-03-07 07:30:25 +09:00
commit c5b673ced6
10 changed files with 216 additions and 102 deletions

View File

@ -285,10 +285,14 @@ bool CDirect3D::Initialize(HWND hWnd)
DXTRACE_ERR_MSGBOX(TEXT("Error setting cg device"), hr);
}
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
init_done = true;
SetViewport();
ApplyDisplayChanges();
return true;
@ -342,6 +346,26 @@ bool CDirect3D::SetShader(const TCHAR *file)
}
}
void CDirect3D::checkForCgError(const char *situation)
{
char buffer[4096];
CGerror error = cgGetError();
const char *string = cgGetErrorString(error);
if (error != CG_NO_ERROR) {
sprintf(buffer,
"Situation: %s\n"
"Error: %s\n\n"
"Cg compiler output...\n", situation, string);
MessageBoxA(0, buffer,
"Cg error", MB_OK|MB_ICONEXCLAMATION);
if (error == CG_COMPILER_ERROR) {
MessageBoxA(0, cgGetLastListing(cgContext),
"Cg compilation error", MB_OK|MB_ICONEXCLAMATION);
}
}
}
bool CDirect3D::SetShaderCG(const TCHAR *file)
{
TCHAR errorMsg[MAX_PATH + 50];
@ -372,20 +396,39 @@ bool CDirect3D::SetShaderCG(const TCHAR *file)
cgVertexProgram = cgCreateProgram( cgContext, CG_SOURCE, fileContents,
vertexProfile, "main_vertex", vertexOptions);
checkForCgError("Compiling vertex program");
cgFragmentProgram = cgCreateProgram( cgContext, CG_SOURCE, fileContents,
pixelProfile, "main_fragment", pixelOptions);
checkForCgError("Compiling fragment program");
delete [] fileContents;
if(!cgVertexProgram && !cgFragmentProgram) {
_stprintf(errorMsg,TEXT("No vertex or fragment program in file:\n%s"),file);
MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
if(!cgVertexProgram || !cgFragmentProgram) {
return false;
}
if(cgVertexProgram) {
hr = cgD3D9LoadProgram(cgVertexProgram,false,0);
hr = cgD3D9LoadProgram(cgVertexProgram,true,0);
hr = cgD3D9BindProgram(cgVertexProgram);
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMATRIX mvp;
pDevice->GetTransform(D3DTS_WORLD,&matWorld);
pDevice->GetTransform(D3DTS_VIEW,&matView);
pDevice->GetTransform(D3DTS_PROJECTION,&matProj);
mvp = matWorld * matView * matProj;
D3DXMatrixTranspose(&mvp,&mvp);
CGparameter cgpModelViewProj = cgGetNamedParameter(cgVertexProgram, "modelViewProj");
if(cgpModelViewProj)
cgD3D9SetUniformMatrix(cgpModelViewProj,&mvp);
}
if(cgFragmentProgram) {
hr = cgD3D9LoadProgram(cgFragmentProgram,false,0);
@ -592,13 +635,7 @@ void CDirect3D::SetShaderVars()
}
}
} else if(shader_type == D3D_SHADER_CG) {
CGparameter cgpModelViewProj = cgGetNamedParameter(cgVertexProgram, "modelViewProj");
CGparameter cgpVideoSize = cgGetNamedParameter(cgFragmentProgram, "IN.video_size");
CGparameter cgpTextureSize = cgGetNamedParameter(cgFragmentProgram, "IN.texture_size");
CGparameter cgpOutputSize = cgGetNamedParameter(cgFragmentProgram, "IN.output_size");
D3DXMATRIX mvpMat;
D3DXVECTOR2 videoSize;
D3DXVECTOR2 textureSize;
D3DXVECTOR2 outputSize;
@ -608,16 +645,20 @@ void CDirect3D::SetShaderVars()
outputSize.x = GUI.Stretch?(float)dPresentParams.BackBufferWidth:(float)afterRenderWidth;
outputSize.y = GUI.Stretch?(float)dPresentParams.BackBufferHeight:(float)afterRenderHeight;
D3DXMatrixIdentity(&mvpMat);
#define setProgramUniform(program,varname,floats)\
{\
CGparameter cgp = cgGetNamedParameter(program, varname);\
if(cgp)\
cgD3D9SetUniform(cgp,floats);\
}\
if(cgpModelViewProj)
cgD3D9SetUniformMatrix(cgpModelViewProj,&mvpMat);
if(cgpVideoSize)
cgD3D9SetUniform(cgpVideoSize,&videoSize);
if(cgpTextureSize)
cgD3D9SetUniform(cgpTextureSize,&textureSize);
if(cgpOutputSize)
cgD3D9SetUniform(cgpOutputSize,&outputSize);
setProgramUniform(cgFragmentProgram,"IN.video_size",&videoSize);
setProgramUniform(cgFragmentProgram,"IN.texture_size",&textureSize);
setProgramUniform(cgFragmentProgram,"IN.output_size",&outputSize);
setProgramUniform(cgVertexProgram,"IN.video_size",&videoSize);
setProgramUniform(cgVertexProgram,"IN.texture_size",&textureSize);
setProgramUniform(cgVertexProgram,"IN.output_size",&outputSize);
}
}
@ -677,11 +718,11 @@ void CDirect3D::Render(SSurface Src)
drawSurface->UnlockRect(0);
}
//if the output size of the render method changes we need new vertices
//if the output size of the render method changes we need to update the viewport
if(afterRenderHeight != dstRect.bottom || afterRenderWidth != dstRect.right) {
afterRenderHeight = dstRect.bottom;
afterRenderWidth = dstRect.right;
SetupVertices();
SetViewport();
}
if(!GUI.Stretch||GUI.AspectRatio)
@ -693,13 +734,13 @@ void CDirect3D::Render(SSurface Src)
pDevice->SetFVF(FVF_COORDS_TEX);
pDevice->SetStreamSource(0,vertexBuffer,0,sizeof(VERTEX));
SetShaderVars();
if(shader_type == D3D_SHADER_CG) {
cgD3D9BindProgram(cgFragmentProgram);
cgD3D9BindProgram(cgVertexProgram);
}
SetShaderVars();
if (shader_type == D3D_SHADER_HLSL) {
UINT passes;
@ -813,26 +854,45 @@ calculates the vertex coordinates
*/
void CDirect3D::SetupVertices()
{
RECT drawRect;
void *pLockedVertexBuffer;
drawRect = CalculateDisplayRect(afterRenderWidth,afterRenderHeight,dPresentParams.BackBufferWidth,dPresentParams.BackBufferHeight);
float tX = (float)afterRenderWidth / (float)quadTextureSize;
float tY = (float)afterRenderHeight / (float)quadTextureSize;
//we need to substract -0.5 from the x/y coordinates to match texture with pixel space
//see http://msdn.microsoft.com/en-us/library/bb219690(VS.85).aspx
triangleStripVertices[0] = VERTEX((float)drawRect.left - 0.5f,(float)drawRect.bottom - 0.5f,0.0f,1.0f,0.0f,tY);
triangleStripVertices[1] = VERTEX((float)drawRect.left - 0.5f,(float)drawRect.top - 0.5f,0.0f,1.0f,0.0f,0.0f);
triangleStripVertices[2] = VERTEX((float)drawRect.right - 0.5f,(float)drawRect.bottom - 0.5f,0.0f,1.0f,tX,tY);
triangleStripVertices[3] = VERTEX((float)drawRect.right - 0.5f,(float)drawRect.top - 0.5f,0.0f,1.0f,tX,0.0f);
triangleStripVertices[0] = VERTEX(0.0f,0.0f,0.0f,0.0f,tY);
triangleStripVertices[1] = VERTEX(0.0f,1.0f,0.0f,0.0f,0.0f);
triangleStripVertices[2] = VERTEX(1.0f,0.0f,0.0f,tX,tY);
triangleStripVertices[3] = VERTEX(1.0f,1.0f,0.0f,tX,0.0f);
HRESULT hr = vertexBuffer->Lock(0,0,&pLockedVertexBuffer,NULL);
memcpy(pLockedVertexBuffer,triangleStripVertices,sizeof(triangleStripVertices));
vertexBuffer->Unlock();
}
void CDirect3D::SetViewport()
{
D3DXMATRIX matIdentity;
D3DXMATRIX matProjection;
D3DXMatrixOrthoOffCenterLH(&matProjection,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f);
D3DXMatrixIdentity(&matIdentity);
pDevice->SetTransform(D3DTS_WORLD,&matIdentity);
pDevice->SetTransform(D3DTS_VIEW,&matIdentity);
pDevice->SetTransform(D3DTS_PROJECTION,&matProjection);
RECT drawRect = CalculateDisplayRect(afterRenderWidth,afterRenderHeight,dPresentParams.BackBufferWidth,dPresentParams.BackBufferHeight);
D3DVIEWPORT9 viewport;
viewport.X = drawRect.left;
viewport.Y = drawRect.top;
viewport.Height = drawRect.bottom - drawRect.top;
viewport.Width = drawRect.right - drawRect.left;
viewport.MinZ = 0.0f;
viewport.MaxZ = 1.0f;
HRESULT hr = pDevice->SetViewport(&viewport);
SetupVertices();
}
/* CDirect3D::ChangeRenderSize
determines if we need to reset the device (if the size changed)
called with (0,0) whenever we want new settings to take effect
@ -853,7 +913,8 @@ bool CDirect3D::ChangeRenderSize(unsigned int newWidth, unsigned int newHeight)
if(!ResetDevice())
return false;
SetupVertices();
SetViewport();
return true;
}
@ -912,6 +973,8 @@ bool CDirect3D::ResetDevice()
pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
}
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//recreate the surface

View File

@ -190,15 +190,14 @@
#include "wsnes9x.h"
#include "IS9xDisplayOutput.h"
#define FVF_COORDS_TEX D3DFVF_XYZRHW | D3DFVF_TEX1
#define FVF_COORDS_TEX D3DFVF_XYZ | D3DFVF_TEX1
typedef struct _VERTEX {
float x, y, z;
float rhw;
float tx, ty;
_VERTEX() {}
_VERTEX(float x,float y,float z,float rhw,float tx,float ty) {
this->x=x;this->y=y;this->z=z;this->rhw=rhw;this->tx=tx;this->ty=ty;
_VERTEX(float x,float y,float z,float tx,float ty) {
this->x=x;this->y=y;this->z=z;this->tx=tx;this->ty=ty;
}
} VERTEX; //our custom vertex with a constuctor for easier assignment
@ -226,6 +225,7 @@ private:
CGcontext cgContext;
CGprogram cgVertexProgram, cgFragmentProgram;
current_d3d_shader_type shader_type;
float shaderTimer;
int shaderTimeStart;
int shaderTimeElapsed;
@ -234,11 +234,13 @@ private:
void CreateDrawSurface();
void DestroyDrawSurface();
bool ChangeDrawSurfaceSize(unsigned int scale);
void SetViewport();
void SetupVertices();
bool ResetDevice();
void SetShaderVars();
bool SetShader(const TCHAR *file);
bool SetShaderHLSL(const TCHAR *file);
void checkForCgError(const char *situation);
bool SetShaderCG(const TCHAR *file);
public:

View File

@ -282,14 +282,25 @@ void COpenGL::Render(SSurface Src)
} else if(shader_type == OGL_SHADER_CG) {
CGparameter cgpModelViewProj = cgGetNamedParameter(cgVertexProgram, "modelViewProj");
cgGLSetStateMatrixParameter(cgpModelViewProj, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
CGparameter cgpVideoSize = cgGetNamedParameter(cgFragmentProgram, "IN.video_size");
CGparameter cgpTextureSize = cgGetNamedParameter(cgFragmentProgram, "IN.texture_size");
CGparameter cgpOutputSize = cgGetNamedParameter(cgFragmentProgram, "IN.output_size");
cgGLSetStateMatrixParameter(cgpModelViewProj, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
cgGLSetParameter2fv(cgpVideoSize, inputSize);
cgGLSetParameter2fv(cgpTextureSize, textureSize);
cgGLSetParameter2fv(cgpOutputSize, outputSize);
#define setProgram2fv(program,varname,floats)\
{\
CGparameter cgp = cgGetNamedParameter(program, varname);\
if(cgp)\
cgGLSetParameter2fv(cgp,floats);\
}\
setProgram2fv(cgFragmentProgram,"IN.video_size",inputSize);
setProgram2fv(cgFragmentProgram,"IN.texture_size",textureSize);
setProgram2fv(cgFragmentProgram,"IN.output_size",outputSize);
setProgram2fv(cgVertexProgram,"IN.video_size",inputSize);
setProgram2fv(cgVertexProgram,"IN.texture_size",textureSize);
setProgram2fv(cgVertexProgram,"IN.output_size",outputSize);
}
}
@ -332,7 +343,6 @@ bool COpenGL::ApplyDisplayChanges(void)
RECT windowSize;
GetClientRect(hWnd,&windowSize);
ChangeRenderSize(windowSize.right,windowSize.bottom);
SetupVertices();
return true;
}
@ -487,6 +497,26 @@ bool COpenGL::SetShaders(const TCHAR *file)
}
}
void COpenGL::checkForCgError(const char *situation)
{
char buffer[4096];
CGerror error = cgGetError();
const char *string = cgGetErrorString(error);
if (error != CG_NO_ERROR) {
sprintf(buffer,
"Situation: %s\n"
"Error: %s\n\n"
"Cg compiler output...\n", situation, string);
MessageBoxA(0, buffer,
"Cg error", MB_OK|MB_ICONEXCLAMATION);
if (error == CG_COMPILER_ERROR) {
MessageBoxA(0, cgGetLastListing(cgContext),
"Cg compilation error", MB_OK|MB_ICONEXCLAMATION);
}
}
}
bool COpenGL::SetShadersCG(const TCHAR *file)
{
TCHAR errorMsg[MAX_PATH + 50];
@ -520,14 +550,16 @@ bool COpenGL::SetShadersCG(const TCHAR *file)
cgVertexProgram = cgCreateProgram( cgContext, CG_SOURCE, fileContents,
vertexProfile, "main_vertex", NULL);
checkForCgError("Compiling vertex program");
cgFragmentProgram = cgCreateProgram( cgContext, CG_SOURCE, fileContents,
fragmentProfile, "main_fragment", NULL);
checkForCgError("Compiling fragment program");
delete [] fileContents;
if(!cgVertexProgram && !cgFragmentProgram) {
_stprintf(errorMsg,TEXT("No vertex or fragment program in file:\n%s"),file);
MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION);
if(!cgVertexProgram || !cgFragmentProgram) {
return false;
}

View File

@ -246,6 +246,7 @@ private:
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
bool SetShaders(const TCHAR *file);
void checkForCgError(const char *situation);
bool SetShadersCG(const TCHAR *file);
bool SetShadersGLSL(const TCHAR *glslFileName);
bool LoadShaderFunctions();

View File

@ -220,15 +220,21 @@ void RenderBlarggNTSCComposite(SSurface Src, SSurface Dst, RECT *);
void RenderBlarggNTSCSvideo(SSurface Src, SSurface Dst, RECT *);
void RenderBlarggNTSCRgb(SSurface Src, SSurface Dst, RECT *);
void RenderBlarggNTSC(SSurface Src, SSurface Dst, RECT *);
void RenderMergeHires(void *src, int srcPitch , void* dst, int dstPitch, unsigned int width, unsigned int height);
void InitLUTsWin32(void);
// Contains the pointer to the now active render method
TRenderMethod RenderMethod = RenderPlain;
TRenderMethod RenderMethodHiRes = RenderPlain;
typedef void (*TRenderMethod)( SSurface Src, SSurface Dst, RECT *);
TRenderMethod _RenderMethod = RenderPlain;
TRenderMethod _RenderMethodHiRes = RenderPlain;
// Used as change log
static uint8 ChangeLog1 [EXT_PITCH * MAX_SNES_HEIGHT];
static uint8 ChangeLog2 [EXT_PITCH * MAX_SNES_HEIGHT];
static uint8 ChangeLog3 [EXT_PITCH * MAX_SNES_HEIGHT];
BYTE *BlendBuf = NULL;
BYTE *BlendBuffer = NULL;
uint8 *ChangeLog [3] = {
ChangeLog1, ChangeLog2, ChangeLog3
};
@ -237,6 +243,11 @@ START_EXTERN_C
uint8 snes9x_clear_change_log = 0;
END_EXTERN_C
enum BlarggMode { UNINITIALIZED,BLARGGCOMPOSITE,BLARGGSVIDEO,BLARGGRGB };
snes_ntsc_t *ntsc = NULL;
BlarggMode blarggMode = UNINITIALIZED;
TRenderMethod FilterToMethod(RenderFilter filterID)
{
switch(filterID)
@ -381,15 +392,30 @@ inline static bool GetFilter32BitSupport(RenderFilter filterID)
}
}
inline static bool GetFilterBlendSupport(RenderFilter filterID)
{
switch(filterID)
{
case FILTER_SIMPLE1X:
case FILTER_BLARGGCOMP:
case FILTER_BLARGGSVID:
case FILTER_BLARGGRGB:
return true;
default:
return false;
}
}
void SelectRenderMethod()
{
TRenderMethod OldRenderMethod = RenderMethod;
TRenderMethod OldRenderMethodHiRes = RenderMethodHiRes;
TRenderMethod OldRenderMethod = _RenderMethod;
TRenderMethod OldRenderMethodHiRes = _RenderMethodHiRes;
RenderMethod = FilterToMethod(GUI.Scale);
RenderMethodHiRes = FilterToMethod(GUI.ScaleHiRes);
_RenderMethod = FilterToMethod(GUI.Scale);
_RenderMethodHiRes = FilterToMethod(GUI.ScaleHiRes);
if (OldRenderMethod != RenderMethod || OldRenderMethodHiRes != RenderMethodHiRes)
if (OldRenderMethod != _RenderMethod || OldRenderMethodHiRes != _RenderMethodHiRes)
snes9x_clear_change_log = GUI.NumFlipFrames;
GUI.DepthConverted = !GUI.NeedDepthConvert;
@ -402,6 +428,32 @@ void SelectRenderMethod()
}
}
void RenderMethod(SSurface Src, SSurface Dst, RECT * rect)
{
if(Src.Height > SNES_HEIGHT_EXTENDED || Src.Width == 512) {
if(GUI.BlendHiRes && Src.Width == 512 && !GetFilterBlendSupport(GUI.ScaleHiRes)) {
RenderMergeHires(Src.Surface,Src.Pitch,BlendBuffer,EXT_PITCH,Src.Width,Src.Height);
Src.Surface = BlendBuffer;
}
_RenderMethodHiRes(Src,Dst,rect);
} else {
_RenderMethod(Src,Dst,rect);
}
}
void InitRenderFilters(void)
{
InitLUTsWin32();
if(!ntsc) {
ntsc = new snes_ntsc_t;
}
if(!BlendBuf) {
BlendBuf = new BYTE [EXT_PITCH * EXT_HEIGHT];
BlendBuffer = BlendBuf + EXT_OFFSET;
memset(BlendBuf, 0, EXT_PITCH * EXT_HEIGHT);
}
}
#define R5G6B5 // windows port uses RGB565
#ifdef R5G6B5
@ -550,15 +602,12 @@ inline void SetRect(RECT* rect, int width, int height, int scale)
}
#define AVERAGE_565(el0, el1) (((el0) & (el1)) + ((((el0) ^ (el1)) & 0xF7DE) >> 1))
void RenderMergeHires(void *src, void* dst, int pitch, unsigned int &width, unsigned int &height)
void RenderMergeHires(void *src, int srcPitch , void* dst, int dstPitch, unsigned int width, unsigned int height)
{
if (width <= 256)
return;
for (register int y = 0; y < height; y++)
{
register uint16 *input = (uint16 *) ((uint8 *) src + y * pitch);
register uint16 *output = (uint16 *) ((uint8 *) dst + y * pitch);
register uint16 *input = (uint16 *) ((uint8 *) src + y * srcPitch);
register uint16 *output = (uint16 *) ((uint8 *) dst + y * dstPitch);
register uint16 l, r;
l = 0;
@ -2538,17 +2587,8 @@ void RenderSimple4X( SSurface Src, SSurface Dst, RECT *rect)
}
}
enum BlarggMode { UNINITIALIZED,BLARGGCOMPOSITE,BLARGGSVIDEO,BLARGGRGB };
snes_ntsc_t *ntsc = NULL;
BlarggMode blarggMode = UNINITIALIZED;
void RenderBlarggNTSCComposite( SSurface Src, SSurface Dst, RECT *rect)
{
if(!ntsc) {
ntsc = (snes_ntsc_t *)malloc(sizeof(snes_ntsc_t));
}
if(blarggMode!=BLARGGCOMPOSITE) {
snes_ntsc_setup_t setup = snes_ntsc_composite;
setup.merge_fields = 1;
@ -2560,9 +2600,6 @@ void RenderBlarggNTSCComposite( SSurface Src, SSurface Dst, RECT *rect)
void RenderBlarggNTSCSvideo( SSurface Src, SSurface Dst, RECT *rect)
{
if(!ntsc) {
ntsc = (snes_ntsc_t *)malloc(sizeof(snes_ntsc_t));
}
if(blarggMode!=BLARGGSVIDEO) {
snes_ntsc_setup_t setup = snes_ntsc_svideo;
setup.merge_fields = 1;
@ -2574,9 +2611,6 @@ void RenderBlarggNTSCSvideo( SSurface Src, SSurface Dst, RECT *rect)
void RenderBlarggNTSCRgb( SSurface Src, SSurface Dst, RECT *rect)
{
if(!ntsc) {
ntsc = (snes_ntsc_t *)malloc(sizeof(snes_ntsc_t));
}
if(blarggMode!=BLARGGRGB) {
snes_ntsc_setup_t setup = snes_ntsc_rgb;
setup.merge_fields = 1;

View File

@ -191,13 +191,9 @@ struct SSurface {
unsigned int Width, Height;
};
typedef void (*TRenderMethod)( SSurface Src, SSurface Dst, RECT *);
void RenderMethod(SSurface Src, SSurface Dst, RECT *);
void SelectRenderMethod();
void InitLUTsWin32();
void RenderMergeHires(void *src, void* dst, int pitch, unsigned int &width, unsigned int &height);
extern TRenderMethod RenderMethod;
extern TRenderMethod RenderMethodHiRes;
void InitRenderFilters();
#endif

View File

@ -204,9 +204,7 @@
#include <math.h>
BYTE *ScreenBuf = NULL;
BYTE *ScreenBufBlend = NULL;
BYTE *ScreenBuffer = NULL;
BYTE *ScreenBufferBlend = NULL;
struct SJoyState Joystick [16];
uint32 joypads [8];
@ -979,12 +977,8 @@ void InitSnes9X( void)
Memory.PostRomInitFunc = S9xPostRomInit;
ScreenBuf = new BYTE [EXT_PITCH * EXT_HEIGHT];
ScreenBufBlend = new BYTE [EXT_PITCH * EXT_HEIGHT];
ScreenBuffer = ScreenBuf + EXT_OFFSET;
ScreenBufferBlend = ScreenBufBlend + EXT_OFFSET;
memset (ScreenBuf, 0, EXT_PITCH * EXT_HEIGHT);
memset (ScreenBufBlend, 0, EXT_PITCH * EXT_HEIGHT);
GFX.Pitch = EXT_PITCH;
GFX.RealPPL = EXT_PITCH;
@ -1008,8 +1002,7 @@ void DeinitS9x()
{
if(ScreenBuf)
delete [] ScreenBuf;
if(ScreenBufBlend)
delete [] ScreenBufBlend;
DeleteCriticalSection(&GUI.SoundCritSect);
CoUninitialize();
if(GUI.GunSight)

View File

@ -222,13 +222,6 @@ void WinRefreshDisplay(void)
SelectRenderMethod ();
Src.Surface = (BYTE *)GFX.Screen;
if(Src.Width > SNES_WIDTH && GUI.BlendHiRes) {
RenderMergeHires(Src.Surface,ScreenBufferBlend,Src.Pitch,Src.Width,Src.Height);
Src.Surface = ScreenBufferBlend;
}
S9xDisplayOutput->Render(Src);
GUI.FlipCounter++;
}
@ -796,7 +789,7 @@ void WinDisplayStringFromBottom (const char *string, int linesFromBottom, int pi
static int font_width = 8, font_height = 9;
static void *displayScreen;
int displayPpl, displayWidth, displayHeight, displayScale,fontwidth_scaled,fontheight_scaled;
int displayPpl, displayWidth, displayHeight, displayScale, fontwidth_scaled, fontheight_scaled;
void WinSetCustomDisplaySurface(void *screen, int ppl, int width, int height, int scale)
{
@ -804,7 +797,7 @@ void WinSetCustomDisplaySurface(void *screen, int ppl, int width, int height, in
displayPpl=ppl;
displayWidth=width;
displayHeight=height;
displayScale=scale;
displayScale=max(1,width/IPPU.RenderedScreenWidth);
fontwidth_scaled=font_width*displayScale;
fontheight_scaled=font_height*displayScale;
}
@ -933,7 +926,7 @@ void WinDisplayStringInBuffer (const char *string, int linesFromBottom, int pixe
if (linesFromBottom <= 0)
linesFromBottom = 1;
screenPtrType *dst = (screenPtrType *)displayScreen + (displayHeight - fontheight_scaled * linesFromBottom) * displayPpl + (int)(pixelsFromLeft * (2*(float)displayWidth/IPPU.RenderedScreenWidth - displayScale));
screenPtrType *dst = (screenPtrType *)displayScreen + (displayHeight - fontheight_scaled * linesFromBottom) * displayPpl + (int)(pixelsFromLeft * (float)displayWidth/IPPU.RenderedScreenWidth);
int len = strlen(string);
int max_chars = displayWidth / (fontwidth_scaled - displayScale);

View File

@ -183,7 +183,6 @@
#include <vector>
#define IsHiRes(x) ((x.Height > SNES_HEIGHT_EXTENDED || x.Width == 512))
#define RenderMethod (IsHiRes(Src) ? RenderMethodHiRes : RenderMethod)
#define CurrentScale (IsHiRes(Src) ? GUI.ScaleHiRes : GUI.Scale)
void WinRefreshDisplay(void);

View File

@ -3217,7 +3217,7 @@ int WINAPI WinMain(
SetMenu (GUI.hWnd, NULL);
}
InitLUTsWin32(); // init win hq2x
InitRenderFilters();
GUI.ControlForced = 0xff;
@ -7085,12 +7085,15 @@ INT_PTR CALLBACK DlgFunky(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
strcpy(temp,GetFilterName((RenderFilter)filter));
SendDlgItemMessageA(hDlg,IDC_FILTERBOX,CB_ADDSTRING,0,(LPARAM) (LPCTSTR)temp);
}
for(int filter = 0 ; filter < (int)NUM_FILTERS ; filter++)
for(int filter = 0, hiResPos = 0 ; filter < (int)NUM_FILTERS ; filter++)
{
if(GetFilterHiResSupport((RenderFilter)filter))
{
strcpy(temp,GetFilterName((RenderFilter)filter));
SendDlgItemMessageA(hDlg,IDC_FILTERBOX2,CB_ADDSTRING,0,(LPARAM) (LPCTSTR)temp);
if(GUI.ScaleHiRes==filter)
SendDlgItemMessage(hDlg,IDC_FILTERBOX2,CB_SETCURSEL,(WPARAM)hiResPos,0);
hiResPos++;
}
}
@ -7101,8 +7104,6 @@ INT_PTR CALLBACK DlgFunky(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
// have to start focus on something like this or Escape won't exit the dialog
SetFocus(hDlg);
SendDlgItemMessage(hDlg,IDC_FILTERBOX2,CB_SETCURSEL,(WPARAM)GUI.ScaleHiRes,0);
break;
case WM_CLOSE:
case WM_DESTROY: