15 changes: 11 additions & 4 deletions Source/Core/Common/Src/ArmEmitter.h
Expand Up @@ -357,8 +357,12 @@ class ARMXEmitter
void WriteShiftedDataOp(u32 op, bool SetFlags, ARMReg dest, ARMReg src, ARMReg op2);
void WriteShiftedDataOp(u32 op, bool SetFlags, ARMReg dest, ARMReg src, Operand2 op2);
void WriteSignedMultiply(u32 Op, u32 Op2, u32 Op3, ARMReg dest, ARMReg r1, ARMReg r2);



u32 EncodeVd(ARMReg Vd);
u32 EncodeVn(ARMReg Vn);
u32 EncodeVm(ARMReg Vm);
void WriteVFPDataOp(u32 Op, ARMReg Vd, ARMReg Vn, ARMReg Vm);

void Write4OpMultiply(u32 op, ARMReg destLo, ARMReg destHi, ARMReg rn, ARMReg rm);

// New Ops
Expand Down Expand Up @@ -528,9 +532,11 @@ class ARMXEmitter
// VFP Only
void VLDR(ARMReg Dest, ARMReg Base, s16 offset);
void VSTR(ARMReg Src, ARMReg Base, s16 offset);
void VCMP(ARMReg Vd, ARMReg Vm, bool E);
void VCMP(ARMReg Vd, ARMReg Vm);
void VCMPE(ARMReg Vd, ARMReg Vm);
// Compares against zero
void VCMP(ARMReg Vd, bool E);
void VCMP(ARMReg Vd);
void VCMPE(ARMReg Vd);
void VDIV(ARMReg Vd, ARMReg Vn, ARMReg Vm);
void VSQRT(ARMReg Vd, ARMReg Vm);

Expand All @@ -541,6 +547,7 @@ class ARMXEmitter
void VNEG(ARMReg Vd, ARMReg Vm);
void VMUL(ARMReg Vd, ARMReg Vn, ARMReg Vm);
void VMLA(ARMReg Vd, ARMReg Vn, ARMReg Vm);
void VMLS(ARMReg Vd, ARMReg Vn, ARMReg Vm);
void VMOV(ARMReg Dest, ARMReg Src, bool high);
void VMOV(ARMReg Dest, ARMReg Src);
void VCVT(ARMReg Dest, ARMReg Src, int flags);
Expand Down
4 changes: 2 additions & 2 deletions Source/Core/Common/Src/StringUtil.cpp
Expand Up @@ -395,7 +395,7 @@ std::string UTF16ToUTF8(const std::wstring& input)
std::string output;
output.resize(size);

if (size != WideCharToMultiByte(CP_UTF8, 0, input.data(), input.size(), &output[0], output.size(), nullptr, nullptr))
if (size == 0 || size != WideCharToMultiByte(CP_UTF8, 0, input.data(), input.size(), &output[0], output.size(), nullptr, nullptr))
output.clear();

return output;
Expand All @@ -408,7 +408,7 @@ std::wstring CPToUTF16(u32 code_page, const std::string& input)
std::wstring output;
output.resize(size);

if (size != MultiByteToWideChar(code_page, 0, input.data(), input.size(), &output[0], output.size()))
if (size == 0 || size != MultiByteToWideChar(code_page, 0, input.data(), input.size(), &output[0], output.size()))
output.clear();

return output;
Expand Down
14 changes: 8 additions & 6 deletions Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
Expand Up @@ -27,6 +27,8 @@ namespace OGL

static const u32 UBO_LENGTH = 32*1024*1024;

GLintptr ProgramShaderCache::s_vs_data_size;
GLintptr ProgramShaderCache::s_ps_data_size;
GLintptr ProgramShaderCache::s_vs_data_offset;
u8 *ProgramShaderCache::s_ubo_buffer;
u32 ProgramShaderCache::s_ubo_buffer_size;
Expand Down Expand Up @@ -169,8 +171,8 @@ void ProgramShaderCache::UploadConstants()
if(s_ubo_dirty) {
s_buffer->Alloc(s_ubo_buffer_size);
size_t offset = s_buffer->Upload(s_ubo_buffer, s_ubo_buffer_size);
glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_vs_data_offset);
glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_ubo_buffer_size - s_vs_data_offset);
glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, s_ps_data_size);
glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset + s_vs_data_offset, s_vs_data_size);
s_ubo_dirty = false;
}
}
Expand Down Expand Up @@ -388,10 +390,10 @@ void ProgramShaderCache::Init(void)
GLint Align;
glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &Align);

GLintptr const ps_data_size = ROUND_UP(C_PENVCONST_END * sizeof(float) * 4, Align);
GLintptr const vs_data_size = ROUND_UP(C_VENVCONST_END * sizeof(float) * 4, Align);
s_vs_data_offset = ps_data_size;
s_ubo_buffer_size = ps_data_size + vs_data_size;
s_ps_data_size = C_PENVCONST_END * sizeof(float) * 4;
s_vs_data_size = C_VENVCONST_END * sizeof(float) * 4;
s_vs_data_offset = ROUND_UP(s_ps_data_size, Align);
s_ubo_buffer_size = ROUND_UP(s_ps_data_size, Align) + ROUND_UP(s_vs_data_size, Align);

// We multiply by *4*4 because we need to get down to basic machine units.
// So multiply by four to get how many floats we have from vec4s
Expand Down
2 changes: 2 additions & 0 deletions Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h
Expand Up @@ -125,6 +125,8 @@ class ProgramShaderCache
static PCacheEntry* last_entry;
static SHADERUID last_uid;

static GLintptr s_vs_data_size;
static GLintptr s_ps_data_size;
static GLintptr s_vs_data_offset;
static u8 *s_ubo_buffer;
static u32 s_ubo_buffer_size;
Expand Down
57 changes: 41 additions & 16 deletions Source/Plugins/Plugin_VideoOGL/Src/Render.cpp
Expand Up @@ -65,6 +65,7 @@
#include "ConfigManager.h"
#include "VertexManager.h"
#include "SamplerCache.h"
#include "StreamBuffer.h"

#include "main.h" // Local
#ifdef _WIN32
Expand Down Expand Up @@ -132,47 +133,62 @@ static std::vector<u32> s_efbCache[2][EFB_CACHE_WIDTH * EFB_CACHE_HEIGHT]; // 2

int GetNumMSAASamples(int MSAAMode)
{
int samples, maxSamples;
switch (MSAAMode)
{
case MULTISAMPLE_OFF:
return 1;
samples = 1;
break;

case MULTISAMPLE_2X:
return 2;
samples = 2;
break;

case MULTISAMPLE_4X:
case MULTISAMPLE_CSAA_8X:
case MULTISAMPLE_CSAA_16X:
return 4;
samples = 4;
break;

case MULTISAMPLE_8X:
case MULTISAMPLE_CSAA_8XQ:
case MULTISAMPLE_CSAA_16XQ:
return 8;
samples = 8;
break;

default:
return 1;
samples = 1;
}
glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);

if(samples <= maxSamples) return samples;

ERROR_LOG(VIDEO, "MSAA Bug: %d samples selected, but only %d supported by gpu.", samples, maxSamples);
return maxSamples;
}

int GetNumMSAACoverageSamples(int MSAAMode)
{
if (!s_bHaveCoverageMSAA)
return 0;

int samples;
switch (g_ActiveConfig.iMultisampleMode)
{
case MULTISAMPLE_CSAA_8X:
case MULTISAMPLE_CSAA_8XQ:
return 8;
samples = 8;
break;

case MULTISAMPLE_CSAA_16X:
case MULTISAMPLE_CSAA_16XQ:
return 16;
samples = 16;
break;

default:
return 0;
samples = 0;
}
if(s_bHaveCoverageMSAA || samples == 0) return samples;

ERROR_LOG(VIDEO, "MSAA Bug: CSAA selected, but not supported by gpu.");
return 0;
}

// Init functions
Expand Down Expand Up @@ -244,9 +260,11 @@ Renderer::Renderer()
bSuccess = false;
}

if (!GLEW_ARB_sampler_objects)
if (!GLEW_ARB_sampler_objects && bSuccess)
{
ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need GL_ARB_sampler_objects.");
ERROR_LOG(VIDEO, "GPU: OGL ERROR: Need GL_ARB_sampler_objects."
"GPU: Does your video card support OpenGL 3.2?"
"Please report this issue, then there will be a workaround");
bSuccess = false;
}

Expand All @@ -266,6 +284,13 @@ Renderer::Renderer()
g_Config.backend_info.bSupportsGLSLUBO = false;
ERROR_LOG(VIDEO, "buggy driver detected. Disable UBO");
}

#ifndef _WIN32
if(g_Config.backend_info.bSupportsGLPinnedMemory && !strcmp(gl_vendor, "Advanced Micro Devices, Inc.")) {
g_Config.backend_info.bSupportsGLPinnedMemory = false;
ERROR_LOG(VIDEO, "some fglrx versions have broken pinned memory support, so it's disabled for fglrx");
}
#endif

UpdateActiveConfig();
OSD::AddMessage(StringFromFormat("Missing Extensions: %s%s%s%s%s%s",
Expand All @@ -276,14 +301,14 @@ Renderer::Renderer()
g_ActiveConfig.backend_info.bSupportsGLBaseVertex ? "" : "BaseVertex ",
g_ActiveConfig.backend_info.bSupportsGLSync ? "" : "Sync "
).c_str(), 5000);

if (!bSuccess)
return; // TODO: fail

s_LastMultisampleMode = g_ActiveConfig.iMultisampleMode;
s_MSAASamples = GetNumMSAASamples(s_LastMultisampleMode);
s_MSAACoverageSamples = GetNumMSAACoverageSamples(s_LastMultisampleMode);

if (!bSuccess)
return; // TODO: fail

// Decide frambuffer size
s_backbuffer_width = (int)GLInterface->GetBackBufferWidth();
s_backbuffer_height = (int)GLInterface->GetBackBufferHeight();
Expand Down
4 changes: 3 additions & 1 deletion Source/Plugins/Plugin_VideoOGL/Src/TextureCache.cpp
Expand Up @@ -491,7 +491,9 @@ void TextureCache::DisableStage(unsigned int stage)

void TextureCache::SetStage ()
{
glActiveTexture(GL_TEXTURE0 + s_ActiveTexture);
// -1 is the initial value as we don't know which testure should be bound
if(s_ActiveTexture != (u32)-1)
glActiveTexture(GL_TEXTURE0 + s_ActiveTexture);
}

void TextureCache::SetNextStage ( unsigned int stage )
Expand Down
8 changes: 8 additions & 0 deletions Source/Plugins/Plugin_VideoSoftware/Src/SWRenderer.cpp
Expand Up @@ -20,6 +20,7 @@

#include "../../Plugin_VideoOGL/Src/GLUtil.h"
#include "../../Plugin_VideoOGL/Src/RasterFont.h"
#include "../../Plugin_VideoOGL/Src/ProgramShaderCache.h"
#include "SWRenderer.h"
#include "SWStatistics.h"

Expand All @@ -30,6 +31,7 @@ static GLint uni_tex = -1;
static GLuint program;

// Rasterfont isn't compatible with GLES
// degasus: I think it does, but I can't test it
#ifndef USE_GLES
OGL::RasterFont* s_pfont = NULL;
#endif
Expand All @@ -45,6 +47,7 @@ void SWRenderer::Shutdown()
#ifndef USE_GLES
delete s_pfont;
s_pfont = 0;
OGL::ProgramShaderCache::Shutdown();
#endif
}

Expand Down Expand Up @@ -87,6 +90,8 @@ void SWRenderer::Prepare()
CreateShaders();
// TODO: Enable for GLES once RasterFont supports GLES
#ifndef USE_GLES
// ogl rasterfont depends on ogl programshadercache
OGL::ProgramShaderCache::Init();
s_pfont = new OGL::RasterFont();
glEnable(GL_TEXTURE_2D);
#endif
Expand All @@ -103,6 +108,9 @@ void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color)
left * 2.0f / (float)nBackbufferWidth - 1,
1 - top * 2.0f / (float)nBackbufferHeight,
0, nBackbufferWidth, nBackbufferHeight, color);

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
#endif
}

Expand Down
2,123 changes: 0 additions & 2,123 deletions docs/DSP/DSP_UC_ROM.txt

This file was deleted.