Skip to content

Commit 1ab8625

Browse files
Merge pull request #730 from wheremyfoodat/gl-cleanup
Clean up some OpenGL code
2 parents 006eed5 + a142938 commit 1ab8625

File tree

7 files changed

+46
-37
lines changed

7 files changed

+46
-37
lines changed

src/core/psxemulator.cc

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,6 @@ void PCSX::Emulator::vsync() {
117117
g_system->update(true);
118118
m_cheats->ApplyCheats();
119119

120-
if (m_vblank_count_hideafter) {
121-
if (!(--m_vblank_count_hideafter)) {
122-
PCSX::g_emulator->m_gpu->showScreenPic(NULL);
123-
}
124-
}
125-
126120
if (m_config.RewindInterval > 0 && !(++m_rewind_counter % m_config.RewindInterval)) {
127121
// CreateRewindState();
128122
}

src/core/psxemulator.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ class Emulator {
211211

212212
// It is safe if these overflow
213213
uint32_t m_rewind_counter = 0;
214-
uint8_t m_vblank_count_hideafter = 0;
215214

216215
// Used for overclocking
217216
// Make the timing events trigger faster as we are currently assuming everything

src/gpu/soft/draw.cc

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,13 @@ void ShowGunCursor(unsigned char *surf) {
192192
static GLuint vramTexture = 0;
193193

194194
void DoBufferSwap() {
195+
GLuint textureID = m_gui->getVRAMTexture();
195196
m_gui->setViewport();
196-
m_gui->bindVRAMTexture();
197+
glBindTexture(GL_TEXTURE_2D, textureID);
197198
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 512, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, psxVuw);
198199

199200
if (PSXDisplay.RGB24) {
201+
textureID = vramTexture;
200202
glBindTexture(GL_TEXTURE_2D, vramTexture);
201203
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 682, 512, GL_RGB, GL_UNSIGNED_BYTE, psxVuw);
202204
}
@@ -213,13 +215,8 @@ void DoBufferSwap() {
213215
float width = (PSXDisplay.DisplayEnd.x - PSXDisplay.DisplayPosition.x) / 1024.0f;
214216
float height = (PSXDisplay.DisplayEnd.y - PSXDisplay.DisplayPosition.y) / 512.0f;
215217

216-
GLint textureID;
217-
218-
glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureID);
219218
m_gui->m_offscreenShaderEditor.render(m_gui, textureID, {1024.0f, 512.0f}, {startX, startY}, {width, height},
220219
m_gui->getRenderSize());
221-
222-
glBindTexture(GL_TEXTURE_2D, 0);
223220
m_gui->flip();
224221
}
225222

src/gui/gui.cc

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ end)(jit.status()))
271271

272272
s_this = this;
273273
glfwSetDropCallback(m_window, drop_callback);
274+
glfwSetWindowSizeCallback(m_window, [](GLFWwindow*, int, int) { s_this->m_setupScreenSize = true; });
274275

275276
Resources::loadIcon([this](const uint8_t* data, uint32_t size) {
276277
int x, y, comp;
@@ -467,6 +468,8 @@ end)(jit.status()))
467468
m_biosEditor.title = []() { return _("BIOS"); };
468469
m_biosEditor.show = false;
469470

471+
m_offscreenShaderEditor.init();
472+
m_outputShaderEditor.init();
470473
m_offscreenShaderEditor.compile(this);
471474
m_outputShaderEditor.compile(this);
472475

@@ -510,7 +513,7 @@ end)(jit.status()))
510513
});
511514

512515
startFrame();
513-
m_currentTexture = 1;
516+
m_currentTexture ^= 1;
514517
flip();
515518
}
516519

@@ -549,6 +552,29 @@ void PCSX::GUI::startFrame() {
549552
if (glfwWindowShouldClose(m_window)) g_system->quit();
550553
glfwPollEvents();
551554

555+
if (m_setupScreenSize) {
556+
constexpr float renderRatio = 3.0f / 4.0f;
557+
int w, h;
558+
559+
glfwGetFramebufferSize(m_window, &w, &h);
560+
// Make width/height be 1 at minimum
561+
w = std::max<int>(w, 1);
562+
h = std::max<int>(h, 1);
563+
m_framebufferSize = ImVec2(w, h);
564+
m_renderSize = ImVec2(w, h);
565+
normalizeDimensions(m_renderSize, renderRatio);
566+
567+
// Reset texture and framebuffer storage
568+
glBindTexture(GL_TEXTURE_2D, m_offscreenTextures[0]);
569+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_renderSize.x, m_renderSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
570+
glBindTexture(GL_TEXTURE_2D, m_offscreenTextures[1]);
571+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_renderSize.x, m_renderSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
572+
573+
glBindRenderbuffer(GL_RENDERBUFFER, m_offscreenDepthBuffer);
574+
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, m_renderSize.x, m_renderSize.y);
575+
m_setupScreenSize = false;
576+
}
577+
552578
auto& io = ImGui::GetIO();
553579

554580
if (m_reloadFonts) {
@@ -623,12 +649,10 @@ void PCSX::GUI::flip() {
623649
glBindFramebuffer(GL_FRAMEBUFFER, m_offscreenFrameBuffer);
624650
glBindTexture(GL_TEXTURE_2D, m_offscreenTextures[m_currentTexture]);
625651

626-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_renderSize.x, m_renderSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
627652
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
628653
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
629654

630655
glBindRenderbuffer(GL_RENDERBUFFER, m_offscreenDepthBuffer);
631-
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, m_renderSize.x, m_renderSize.y);
632656
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_offscreenDepthBuffer);
633657
GLuint texture = m_offscreenTextures[m_currentTexture];
634658
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
@@ -639,8 +663,6 @@ void PCSX::GUI::flip() {
639663

640664
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
641665

642-
glViewport(0, 0, m_renderSize.x, m_renderSize.y);
643-
644666
glClearColor(0, 0, 0, 0);
645667
glClearDepthf(0.f);
646668
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -650,17 +672,16 @@ void PCSX::GUI::flip() {
650672
}
651673

652674
void PCSX::GUI::endFrame() {
675+
constexpr float renderRatio = 3.0f / 4.0f;
676+
const int w = m_framebufferSize.x;
677+
const int h = m_framebufferSize.y;
678+
653679
auto& io = ImGui::GetIO();
654680
// bind back the output frame buffer
655681
glBindFramebuffer(GL_FRAMEBUFFER, 0);
656682
auto& emuSettings = PCSX::g_emulator->settings;
657683
auto& debugSettings = emuSettings.get<Emulator::SettingDebugSettings>();
658684

659-
int w, h;
660-
glfwGetFramebufferSize(m_window, &w, &h);
661-
m_renderSize = ImVec2(w, h);
662-
normalizeDimensions(m_renderSize, m_renderRatio);
663-
664685
bool changed = false;
665686

666687
m_offscreenShaderEditor.configure(this);
@@ -692,7 +713,7 @@ void PCSX::GUI::endFrame() {
692713
_("Output"), &outputShown,
693714
ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoCollapse)) {
694715
ImVec2 textureSize = ImGui::GetContentRegionAvail();
695-
normalizeDimensions(textureSize, m_renderRatio);
716+
normalizeDimensions(textureSize, renderRatio);
696717
ImTextureID texture = reinterpret_cast<ImTextureID*>(m_offscreenTextures[m_currentTexture]);
697718
m_outputShaderEditor.renderWithImgui(this, texture, m_renderSize, textureSize);
698719
}

src/gui/gui.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class GUI final {
9999
void update(bool vsync = false);
100100
void flip();
101101
void bindVRAMTexture();
102+
GLuint getVRAMTexture() { return m_VRAMTexture; }
102103
void setViewport();
103104
void setFullscreen(bool);
104105
bool addLog(LogClass logClass, const std::string &msg) {
@@ -189,17 +190,17 @@ class GUI final {
189190
int &m_glfwPosY = settings.get<WindowPosY>().value;
190191
int &m_glfwSizeX = settings.get<WindowSizeX>().value;
191192
int &m_glfwSizeY = settings.get<WindowSizeY>().value;
192-
unsigned int m_VRAMTexture = 0;
193+
GLuint m_VRAMTexture = 0;
193194

194195
unsigned int m_offscreenFrameBuffer = 0;
195196
unsigned int m_offscreenTextures[2] = {0, 0};
196197
unsigned int m_offscreenDepthBuffer = 0;
197-
int m_currentTexture = -1;
198+
int m_currentTexture = 0;
198199

199200
ImVec4 m_backgroundColor = ImColor(114, 144, 154);
201+
ImVec2 m_framebufferSize = ImVec2(1, 1); // Size of GLFW window framebuffer
200202
ImVec2 m_renderSize = ImVec2(1, 1);
201203

202-
float m_renderRatio = 3.0f / 4.0f;
203204
bool &m_fullscreen = {settings.get<Fullscreen>().value};
204205

205206
// GUI
@@ -310,6 +311,7 @@ class GUI final {
310311
Widgets::ShaderEditor m_outputShaderEditor = {"output"};
311312

312313
public:
314+
bool m_setupScreenSize = true;
313315
Widgets::ShaderEditor m_offscreenShaderEditor = {"offscreen"};
314316
ImFont *getMono() { return m_monoFont ? m_monoFont : ImGui::GetIO().Fonts[0].Fonts[0]; }
315317

src/gui/widgets/shader-editor.cc

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ void PCSX::Widgets::ShaderEditor::setDefaults() {
162162
m_luaEditor.setText(c_defaultLuaInvoker);
163163
}
164164

165+
void PCSX::Widgets::ShaderEditor::init() {
166+
glGenVertexArrays(1, &m_vao);
167+
glGenBuffers(1, &m_vbo);
168+
}
169+
165170
std::optional<GLuint> PCSX::Widgets::ShaderEditor::compile(GUI *gui,
166171
const std::vector<std::string_view> &mandatoryAttributes) {
167172
GLint status = 0;
@@ -698,13 +703,7 @@ void PCSX::Widgets::ShaderEditor::render(GUI *gui, GLuint textureID, const ImVec
698703
return;
699704
}
700705

701-
if (m_vao == 0) {
702-
glGenVertexArrays(1, &m_vao);
703-
glGenBuffers(1, &m_vbo);
704-
}
705-
706706
glBindVertexArray(m_vao);
707-
708707
glUseProgram(m_shaderProgram);
709708
struct VertexData {
710709
float positions[3];
@@ -874,8 +873,4 @@ void PCSX::Widgets::ShaderEditor::render(GUI *gui, GLuint textureID, const ImVec
874873
}
875874

876875
glDrawArrays(GL_TRIANGLES, 0, 6);
877-
878-
glUseProgram(0);
879-
glBindVertexArray(0);
880-
glBindBuffer(GL_ARRAY_BUFFER, 0);
881876
}

src/gui/widgets/shader-editor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class ShaderEditor {
5252
}
5353

5454
void setDefaults();
55+
void init();
5556
void reset(GUI*);
5657

5758
bool draw(GUI*, const char* title);

0 commit comments

Comments
 (0)