Skip to content

Commit

Permalink
Merge pull request #13301 from hrydgard/more-gl-state-leaks
Browse files Browse the repository at this point in the history
More GL state leak fixing
  • Loading branch information
hrydgard authored Aug 18, 2020
2 parents 817dd33 + 06a5289 commit d8334ba
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 11 deletions.
1 change: 1 addition & 0 deletions Core/HLE/sceKernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ void __KernelInit()
ERROR_LOG(SCEKERNEL, "Can't init kernel when kernel is running");
return;
}
INFO_LOG(SCEKERNEL, "Initializing kernel...");

__KernelTimeInit();
__InterruptsInit();
Expand Down
2 changes: 1 addition & 1 deletion Core/HLE/sceKernelModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1654,7 +1654,7 @@ void __KernelLoadReset() {
bool __KernelLoadExec(const char *filename, u32 paramPtr, std::string *error_string) {
SceKernelLoadExecParam param;

PSP_SetLoading("Loading game...");
PSP_SetLoading("Loading exec...");

if (paramPtr)
Memory::ReadStruct(paramPtr, &param);
Expand Down
6 changes: 3 additions & 3 deletions Core/System.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ static GPUBackend gpuBackend;
static std::string gpuBackendDevice;

// Ugly!
static bool pspIsInited = false;
static bool pspIsIniting = false;
static bool pspIsQuitting = false;
static volatile bool pspIsInited = false;
static volatile bool pspIsIniting = false;
static volatile bool pspIsQuitting = false;

void ResetUIState() {
globalUIState = UISTATE_MENU;
Expand Down
1 change: 1 addition & 0 deletions GPU/GLES/DrawEngineGLES.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ void DrawEngineGLES::DoFlush() {
if (lastRenderStepId_ != curRenderStepId) {
// Dirty everything that has dynamic state that will need re-recording.
gstate_c.Dirty(DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_BLEND_STATE | DIRTY_RASTER_STATE);
textureCache_->ForgetLastTexture();
lastRenderStepId_ = curRenderStepId;
}

Expand Down
1 change: 0 additions & 1 deletion UI/EmuScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1090,7 +1090,6 @@ void EmuScreen::CreateViews() {
loadingSpinner->SetTag("LoadingSpinner");

// Don't really need this, and it creates a lot of strings to translate...
// Maybe just show "Loading game..." only?
loadingTextView->SetVisibility(V_GONE);
loadingTextView->SetShadow(true);

Expand Down
16 changes: 14 additions & 2 deletions Windows/GPU/WindowsGLContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,13 @@ void FormatDebugOutputARB(char outStr[], size_t outStrSize, GLenum source, GLenu
void DebugCallbackARB(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar *message, GLvoid *userParam) {
// Ignore buffer mapping messages from NVIDIA
if (source == GL_DEBUG_SOURCE_API_ARB && type == GL_DEBUG_TYPE_OTHER_ARB && id == 131185)
if (source == GL_DEBUG_SOURCE_API_ARB && type == GL_DEBUG_TYPE_OTHER_ARB && id == 131185) {
return;
}
// Ignore application messages
if (source == GL_DEBUG_SOURCE_APPLICATION) {
return;
}

(void)length;
FILE *outFile = (FILE *)userParam;
Expand Down Expand Up @@ -366,7 +371,14 @@ bool WindowsGLContext::InitFromRenderThread(std::string *error_message) {

hRC = m_hrc;

if (g_Config.bGfxDebugOutput) {
bool validation = g_Config.bGfxDebugOutput;

// Always run OpenGL validation in debug mode, just like we do with Vulkan if debug layers are installed.
#ifdef _DEBUG
validation = true;
#endif

if (validation) {
if (wglewIsSupported("GL_KHR_debug") == 1) {
glGetError();
glDebugMessageCallback((GLDEBUGPROC)&DebugCallbackARB, nullptr);
Expand Down
1 change: 1 addition & 0 deletions ext/native/thin3d/GLQueueRunner.h
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,7 @@ class GLQueueRunner {
GLuint currentReadHandle_ = 0;

GLuint AllocTextureName();

// Texture name cache. Ripped straight from TextureCacheGLES.
std::vector<GLuint> nameCache_;
std::unordered_map<int, std::string> glStrings_;
Expand Down
25 changes: 21 additions & 4 deletions ext/native/thin3d/thin3d_gl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -483,14 +483,16 @@ class OpenGLContext : public DrawContext {

private:
void ApplySamplers();
void Unbind();

GLRenderManager renderManager_;

OpenGLSamplerState *boundSamplers_[MAX_TEXTURE_SLOTS]{};
OpenGLTexture *boundTextures_[MAX_TEXTURE_SLOTS]{};
DeviceCaps caps_{};

// Bound state
OpenGLSamplerState *boundSamplers_[MAX_TEXTURE_SLOTS]{};
OpenGLTexture *boundTextures_[MAX_TEXTURE_SLOTS]{};

OpenGLPipeline *curPipeline_ = nullptr;
OpenGLBuffer *curVBuffers_[4]{};
int curVBufferOffsets_[4]{};
Expand Down Expand Up @@ -610,17 +612,24 @@ void OpenGLContext::BeginFrame() {
}

void OpenGLContext::EndFrame() {
Unbind();

FrameData &frameData = frameData_[renderManager_.GetCurFrame()];
renderManager_.EndPushBuffer(frameData.push); // upload the data!
renderManager_.Finish();
}

void OpenGLContext::Unbind() {
// Unbind stuff.
for (auto &texture : boundTextures_) {
texture = nullptr;
}
for (auto &sampler : boundSamplers_) {
sampler = nullptr;
}
for (int i = 0; i < ARRAY_SIZE(boundTextures_); i++) {
renderManager_.BindTexture(i, nullptr);
}
curPipeline_ = nullptr;
}

Expand Down Expand Up @@ -663,6 +672,9 @@ class OpenGLTexture : public Texture {
void Bind(int stage) {
render_->BindTexture(stage, tex_);
}
int NumMipmaps() const {
return mipLevels_;
}

private:
void SetImageData(int x, int y, int z, int width, int height, int depth, int level, int stride, const uint8_t *data, TextureCallback callback);
Expand All @@ -679,7 +691,6 @@ class OpenGLTexture : public Texture {

OpenGLTexture::OpenGLTexture(GLRenderManager *render, const TextureDesc &desc) : render_(render) {
generatedMips_ = false;
canWrap_ = true;
width_ = desc.width;
height_ = desc.height;
depth_ = desc.depth;
Expand Down Expand Up @@ -1022,7 +1033,9 @@ void OpenGLContext::ApplySamplers() {
for (int i = 0; i < MAX_TEXTURE_SLOTS; i++) {
const OpenGLSamplerState *samp = boundSamplers_[i];
const OpenGLTexture *tex = boundTextures_[i];
if (!samp || !tex) {
if (tex) {
_assert_(samp);
} else {
continue;
}
GLenum wrapS;
Expand All @@ -1037,6 +1050,7 @@ void OpenGLContext::ApplySamplers() {
GLenum magFilt = samp->magFilt;
GLenum minFilt = tex->HasMips() ? samp->mipMinFilt : samp->minFilt;
renderManager_.SetTextureSampler(i, wrapS, wrapT, magFilt, minFilt, 0.0f);
renderManager_.SetTextureLod(i, 0.0, (float)(tex->NumMipmaps() - 1), 0.0);
}
}

Expand Down Expand Up @@ -1098,6 +1112,9 @@ void OpenGLContext::BindPipeline(Pipeline *pipeline) {
curPipeline_->depthStencil->Apply(&renderManager_, stencilRef_);
curPipeline_->raster->Apply(&renderManager_);
renderManager_.BindProgram(curPipeline_->program_);
} else {
// Wipe bound textures and samplers.
Unbind();
}
}

Expand Down

0 comments on commit d8334ba

Please sign in to comment.