mirror of https://github.com/snes9xgit/snes9x.git
Merge branch 'master' of git://github.com/snes9xgit/snes9x
This commit is contained in:
commit
c5b673ced6
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue