mirror of
https://github.com/libretro/ppsspp.git
synced 2025-03-04 06:28:03 +00:00
Revert "Simpler way to deal with the GL deleter"
This reverts commit 3a988400a702ede4137ee3f6d885796c03d727ea.
This commit is contained in:
parent
c21b02a22d
commit
d6e888a39b
@ -424,52 +424,9 @@ void GLQueueRunner::RunSteps(const std::vector<GLRStep *> &steps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GLQueueRunner::LogSteps(const std::vector<GLRStep *> &steps) {
|
void GLQueueRunner::LogSteps(const std::vector<GLRStep *> &steps) {
|
||||||
for (int i = 0; i < steps.size(); i++) {
|
|
||||||
const GLRStep &step = *steps[i];
|
|
||||||
switch (step.stepType) {
|
|
||||||
case GLRStepType::RENDER:
|
|
||||||
LogRenderPass(step);
|
|
||||||
break;
|
|
||||||
case GLRStepType::COPY:
|
|
||||||
LogCopy(step);
|
|
||||||
break;
|
|
||||||
case GLRStepType::BLIT:
|
|
||||||
LogBlit(step);
|
|
||||||
break;
|
|
||||||
case GLRStepType::READBACK:
|
|
||||||
LogReadback(step);
|
|
||||||
break;
|
|
||||||
case GLRStepType::READBACK_IMAGE:
|
|
||||||
LogReadbackImage(step);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Crash();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
delete steps[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Improve these.
|
|
||||||
void GLQueueRunner::LogRenderPass(const GLRStep &pass) {
|
|
||||||
ILOG("RenderPass (%d commands)", (int)pass.commands.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLQueueRunner::LogCopy(const GLRStep &pass) {
|
|
||||||
ILOG("Copy");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLQueueRunner::LogBlit(const GLRStep &pass) {
|
|
||||||
ILOG("Blit");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLQueueRunner::LogReadback(const GLRStep &pass) {
|
|
||||||
ILOG("Readback");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLQueueRunner::LogReadbackImage(const GLRStep &pass) {
|
|
||||||
ILOG("ReadbackImage");
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLQueueRunner::PerformBlit(const GLRStep &step) {
|
void GLQueueRunner::PerformBlit(const GLRStep &step) {
|
||||||
// Without FBO_ARB / GLES3, this will collide with bind_for_read, but there's nothing
|
// Without FBO_ARB / GLES3, this will collide with bind_for_read, but there's nothing
|
||||||
@ -1040,7 +997,7 @@ void GLQueueRunner::PerformReadback(const GLRStep &pass) {
|
|||||||
const GLuint format = GL_RGBA;
|
const GLuint format = GL_RGBA;
|
||||||
const GLuint type = GL_UNSIGNED_BYTE;
|
const GLuint type = GL_UNSIGNED_BYTE;
|
||||||
const int srcAlignment = 4;
|
const int srcAlignment = 4;
|
||||||
int dstAlignment = (int)DataFormatSizeInBytes(pass.readback.dstFormat);
|
int dstAlignment = DataFormatSizeInBytes(pass.readback.dstFormat);
|
||||||
|
|
||||||
int pixelStride = pass.readback.srcRect.w;
|
int pixelStride = pass.readback.srcRect.w;
|
||||||
// Apply the correct alignment.
|
// Apply the correct alignment.
|
||||||
|
@ -359,6 +359,8 @@ private:
|
|||||||
void LogReadback(const GLRStep &pass);
|
void LogReadback(const GLRStep &pass);
|
||||||
void LogReadbackImage(const GLRStep &pass);
|
void LogReadbackImage(const GLRStep &pass);
|
||||||
|
|
||||||
|
void ResizeReadbackBuffer(size_t requiredSize);
|
||||||
|
|
||||||
void fbo_ext_create(const GLRInitStep &step);
|
void fbo_ext_create(const GLRInitStep &step);
|
||||||
void fbo_bind_fb_target(bool read, GLuint name);
|
void fbo_bind_fb_target(bool read, GLuint name);
|
||||||
GLenum fbo_get_fb_target(bool read, GLuint **cached);
|
GLenum fbo_get_fb_target(bool read, GLuint **cached);
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void GLDeleter::Perform() {
|
void GLDeleter::Perform() {
|
||||||
|
deleterMutex_.lock();
|
||||||
for (auto shader : shaders) {
|
for (auto shader : shaders) {
|
||||||
delete shader;
|
delete shader;
|
||||||
}
|
}
|
||||||
@ -37,6 +38,7 @@ void GLDeleter::Perform() {
|
|||||||
delete framebuffer;
|
delete framebuffer;
|
||||||
}
|
}
|
||||||
framebuffers.clear();
|
framebuffers.clear();
|
||||||
|
deleterMutex_.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
GLRenderManager::GLRenderManager() {
|
GLRenderManager::GLRenderManager() {
|
||||||
@ -358,6 +360,8 @@ void GLRenderManager::Finish() {
|
|||||||
frameData.pull_condVar.notify_all();
|
frameData.pull_condVar.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
frameData_[curFrame_].deleter.Take(deleter_);
|
||||||
|
|
||||||
curFrame_++;
|
curFrame_++;
|
||||||
if (curFrame_ >= MAX_INFLIGHT_FRAMES)
|
if (curFrame_ >= MAX_INFLIGHT_FRAMES)
|
||||||
curFrame_ = 0;
|
curFrame_ = 0;
|
||||||
@ -379,6 +383,10 @@ void GLRenderManager::Submit(int frame, bool triggerFence) {
|
|||||||
|
|
||||||
// When !triggerFence, we notify after syncing with Vulkan.
|
// When !triggerFence, we notify after syncing with Vulkan.
|
||||||
|
|
||||||
|
// Putting deletes here is safe but only because OpenGL has its own delete handling..
|
||||||
|
// ideally we'd like to wait a frame or two.
|
||||||
|
frameData.deleter.Perform();
|
||||||
|
|
||||||
if (useThread_ && triggerFence) {
|
if (useThread_ && triggerFence) {
|
||||||
VLOG("PULL: Frame %d.readyForFence = true", frame);
|
VLOG("PULL: Frame %d.readyForFence = true", frame);
|
||||||
|
|
||||||
@ -409,10 +417,6 @@ void GLRenderManager::Run(int frame) {
|
|||||||
BeginSubmitFrame(frame);
|
BeginSubmitFrame(frame);
|
||||||
|
|
||||||
FrameData &frameData = frameData_[frame];
|
FrameData &frameData = frameData_[frame];
|
||||||
|
|
||||||
// Delete stuff from the last round.
|
|
||||||
frameData.deleter_prev.Perform();
|
|
||||||
|
|
||||||
auto &stepsOnThread = frameData_[frame].steps;
|
auto &stepsOnThread = frameData_[frame].steps;
|
||||||
auto &initStepsOnThread = frameData_[frame].initSteps;
|
auto &initStepsOnThread = frameData_[frame].initSteps;
|
||||||
// queueRunner_.LogSteps(stepsOnThread);
|
// queueRunner_.LogSteps(stepsOnThread);
|
||||||
@ -423,7 +427,6 @@ void GLRenderManager::Run(int frame) {
|
|||||||
|
|
||||||
switch (frameData.type) {
|
switch (frameData.type) {
|
||||||
case GLRRunType::END:
|
case GLRRunType::END:
|
||||||
frameData.deleter_prev.Take(frameData.deleter);
|
|
||||||
EndSubmitFrame(frame);
|
EndSubmitFrame(frame);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -148,12 +148,12 @@ enum class GLRRunType {
|
|||||||
SYNC,
|
SYNC,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Synchronize this externally if needed, no mutex anymore.
|
|
||||||
class GLDeleter {
|
class GLDeleter {
|
||||||
public:
|
public:
|
||||||
void Perform();
|
void Perform();
|
||||||
|
|
||||||
void Take(GLDeleter &other) {
|
void Take(GLDeleter &other) {
|
||||||
|
deleterMutex_.lock();
|
||||||
_assert_msg_(G3D, shaders.empty() && programs.empty() && buffers.empty() && textures.empty() && inputLayouts.empty() && framebuffers.empty(), "Deleter already has stuff");
|
_assert_msg_(G3D, shaders.empty() && programs.empty() && buffers.empty() && textures.empty() && inputLayouts.empty() && framebuffers.empty(), "Deleter already has stuff");
|
||||||
shaders = std::move(other.shaders);
|
shaders = std::move(other.shaders);
|
||||||
programs = std::move(other.programs);
|
programs = std::move(other.programs);
|
||||||
@ -167,6 +167,7 @@ public:
|
|||||||
other.textures.clear();
|
other.textures.clear();
|
||||||
other.inputLayouts.clear();
|
other.inputLayouts.clear();
|
||||||
other.framebuffers.clear();
|
other.framebuffers.clear();
|
||||||
|
deleterMutex_.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<GLRShader *> shaders;
|
std::vector<GLRShader *> shaders;
|
||||||
@ -175,6 +176,7 @@ public:
|
|||||||
std::vector<GLRTexture *> textures;
|
std::vector<GLRTexture *> textures;
|
||||||
std::vector<GLRInputLayout *> inputLayouts;
|
std::vector<GLRInputLayout *> inputLayouts;
|
||||||
std::vector<GLRFramebuffer *> framebuffers;
|
std::vector<GLRFramebuffer *> framebuffers;
|
||||||
|
std::mutex deleterMutex_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLRInputLayout {
|
class GLRInputLayout {
|
||||||
@ -289,22 +291,22 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DeleteShader(GLRShader *shader) {
|
void DeleteShader(GLRShader *shader) {
|
||||||
frameData_[curFrame_].deleter.shaders.push_back(shader);
|
deleter_.shaders.push_back(shader);
|
||||||
}
|
}
|
||||||
void DeleteProgram(GLRProgram *program) {
|
void DeleteProgram(GLRProgram *program) {
|
||||||
frameData_[curFrame_].deleter.programs.push_back(program);
|
deleter_.programs.push_back(program);
|
||||||
}
|
}
|
||||||
void DeleteBuffer(GLRBuffer *buffer) {
|
void DeleteBuffer(GLRBuffer *buffer) {
|
||||||
frameData_[curFrame_].deleter.buffers.push_back(buffer);
|
deleter_.buffers.push_back(buffer);
|
||||||
}
|
}
|
||||||
void DeleteTexture(GLRTexture *texture) {
|
void DeleteTexture(GLRTexture *texture) {
|
||||||
frameData_[curFrame_].deleter.textures.push_back(texture);
|
deleter_.textures.push_back(texture);
|
||||||
}
|
}
|
||||||
void DeleteInputLayout(GLRInputLayout *inputLayout) {
|
void DeleteInputLayout(GLRInputLayout *inputLayout) {
|
||||||
frameData_[curFrame_].deleter.inputLayouts.push_back(inputLayout);
|
deleter_.inputLayouts.push_back(inputLayout);
|
||||||
}
|
}
|
||||||
void DeleteFramebuffer(GLRFramebuffer *framebuffer) {
|
void DeleteFramebuffer(GLRFramebuffer *framebuffer) {
|
||||||
frameData_[curFrame_].deleter.framebuffers.push_back(framebuffer);
|
deleter_.framebuffers.push_back(framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BindFramebufferAsRenderTarget(GLRFramebuffer *fb, GLRRenderPassAction color, GLRRenderPassAction depth, GLRRenderPassAction stencil, uint32_t clearColor, float clearDepth, uint8_t clearStencil);
|
void BindFramebufferAsRenderTarget(GLRFramebuffer *fb, GLRRenderPassAction color, GLRRenderPassAction depth, GLRRenderPassAction stencil, uint32_t clearColor, float clearDepth, uint8_t clearStencil);
|
||||||
@ -700,10 +702,7 @@ private:
|
|||||||
bool hasBegun = false;
|
bool hasBegun = false;
|
||||||
uint32_t curSwapchainImage = -1;
|
uint32_t curSwapchainImage = -1;
|
||||||
|
|
||||||
std::mutex deleter_mutex;
|
|
||||||
GLDeleter deleter;
|
GLDeleter deleter;
|
||||||
GLDeleter deleter_prev;
|
|
||||||
|
|
||||||
std::set<GLPushBuffer *> activePushBuffers;
|
std::set<GLPushBuffer *> activePushBuffers;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -728,6 +727,8 @@ private:
|
|||||||
bool nextFrame = false;
|
bool nextFrame = false;
|
||||||
bool firstFrame = true;
|
bool firstFrame = true;
|
||||||
|
|
||||||
|
GLDeleter deleter_;
|
||||||
|
|
||||||
bool useThread_ = true;
|
bool useThread_ = true;
|
||||||
|
|
||||||
int curFrame_ = 0;
|
int curFrame_ = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user