Skip to content

Commit

Permalink
More work on GL state leaks. Some things really need a redesign.
Browse files Browse the repository at this point in the history
  • Loading branch information
hrydgard committed Aug 18, 2020
1 parent ea376ef commit 5313fc5
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 9 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
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
23 changes: 19 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 @@ -679,7 +688,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 +1030,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 +1047,8 @@ void OpenGLContext::ApplySamplers() {
GLenum magFilt = samp->magFilt;
GLenum minFilt = tex->HasMips() ? samp->mipMinFilt : samp->minFilt;
renderManager_.SetTextureSampler(i, wrapS, wrapT, magFilt, minFilt, 0.0f);
// TODO: Improve this to allow mipmaps. We don't care about those right now though for thin3d stuff.
renderManager_.SetTextureLod(i, 0.0, 0.0, 0.0);
}
}

Expand Down Expand Up @@ -1098,6 +1110,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 5313fc5

Please sign in to comment.