Merge branch 'master' into jgrpp
This commit is contained in:
@@ -13,8 +13,6 @@
|
||||
|
||||
/* Define to disable buffer syncing. Will increase max fast forward FPS but produces artifacts. Mainly useful for performance testing. */
|
||||
// #define NO_GL_BUFFER_SYNC
|
||||
/* Define to enable persistent buffer mapping on AMD GPUs. */
|
||||
// #define GL_MAP_PERSISTENT_AMD
|
||||
/* Define to allow software rendering backends. */
|
||||
// #define GL_ALLOW_SOFTWARE_RENDERER
|
||||
|
||||
@@ -577,14 +575,6 @@ const char *OpenGLBackend::Init()
|
||||
this->persistent_mapping_supported = this->persistent_mapping_supported && (IsOpenGLVersionAtLeast(3, 2) || IsOpenGLExtensionSupported("GL_ARB_sync"));
|
||||
#endif
|
||||
|
||||
#ifndef GL_MAP_PERSISTENT_AMD
|
||||
if (this->persistent_mapping_supported && (strstr(vend, "AMD") != nullptr || strstr(renderer, "Radeon") != nullptr)) {
|
||||
/* AMD GPUs seem to perform badly with persistent buffer mapping, disable it for them. */
|
||||
DEBUG(driver, 3, "OpenGL: Detected AMD GPU, not using persistent buffer mapping due to performance problems");
|
||||
this->persistent_mapping_supported = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (this->persistent_mapping_supported && !BindPersistentBufferExtensions()) {
|
||||
DEBUG(driver, 1, "OpenGL claims to support persistent buffer mapping but doesn't export all functions, not using persistent mapping.");
|
||||
this->persistent_mapping_supported = false;
|
||||
@@ -877,6 +867,22 @@ bool OpenGLBackend::InitShaders()
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the bound pixel buffer to a specific value.
|
||||
* @param len Length of the buffer.
|
||||
* @param data Value to set.
|
||||
* @tparam T Pixel type.
|
||||
*/
|
||||
template <class T>
|
||||
static void ClearPixelBuffer(size_t len, T data)
|
||||
{
|
||||
T *buf = reinterpret_cast<T *>(_glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_READ_WRITE));
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
*buf++ = data;
|
||||
}
|
||||
_glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the size of the drawing window and allocate matching resources.
|
||||
* @param w New width of the window.
|
||||
@@ -893,6 +899,8 @@ bool OpenGLBackend::Resize(int w, int h, bool force)
|
||||
|
||||
_glViewport(0, 0, w, h);
|
||||
|
||||
_glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch);
|
||||
|
||||
this->vid_buffer = nullptr;
|
||||
if (this->persistent_mapping_supported) {
|
||||
_glDeleteBuffers(1, &this->vid_pbo);
|
||||
@@ -911,14 +919,16 @@ bool OpenGLBackend::Resize(int w, int h, bool force)
|
||||
if (_glClearBufferSubData != nullptr) {
|
||||
_glClearBufferSubData(GL_PIXEL_UNPACK_BUFFER, GL_RGBA8, 0, pitch * h * bpp / 8, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, &black.data);
|
||||
} else {
|
||||
uint32 *buf = (uint32 *)_glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_READ_WRITE);
|
||||
for (int i = 0; i < pitch * h; i++) {
|
||||
*buf++ = black.data;
|
||||
}
|
||||
_glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
|
||||
ClearPixelBuffer<uint32>(pitch * h, black.data);
|
||||
}
|
||||
} else if (bpp == 8) {
|
||||
if (_glClearBufferSubData != nullptr) {
|
||||
byte b = 0;
|
||||
_glClearBufferSubData(GL_PIXEL_UNPACK_BUFFER, GL_R8, 0, pitch * h, GL_RED, GL_UNSIGNED_BYTE, &b);
|
||||
} else {
|
||||
ClearPixelBuffer<byte>(pitch * h, 0);
|
||||
}
|
||||
}
|
||||
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
|
||||
_glActiveTexture(GL_TEXTURE0);
|
||||
_glBindTexture(GL_TEXTURE_2D, this->vid_texture);
|
||||
@@ -931,6 +941,7 @@ bool OpenGLBackend::Resize(int w, int h, bool force)
|
||||
_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, nullptr);
|
||||
break;
|
||||
}
|
||||
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
|
||||
/* Does this blitter need a separate animation buffer? */
|
||||
if (BlitterFactory::GetCurrentBlitter()->NeedsAnimationBuffer()) {
|
||||
@@ -944,10 +955,18 @@ bool OpenGLBackend::Resize(int w, int h, bool force)
|
||||
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, this->anim_pbo);
|
||||
_glBufferData(GL_PIXEL_UNPACK_BUFFER, pitch * h, nullptr, GL_DYNAMIC_DRAW);
|
||||
}
|
||||
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
|
||||
/* Initialize buffer as 0 == no remap. */
|
||||
if (_glClearBufferSubData != nullptr) {
|
||||
byte b = 0;
|
||||
_glClearBufferSubData(GL_PIXEL_UNPACK_BUFFER, GL_R8, 0, pitch * h, GL_RED, GL_UNSIGNED_BYTE, &b);
|
||||
} else {
|
||||
ClearPixelBuffer<byte>(pitch * h, 0);
|
||||
}
|
||||
|
||||
_glBindTexture(GL_TEXTURE_2D, this->anim_texture);
|
||||
_glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, nullptr);
|
||||
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
} else {
|
||||
if (this->anim_buffer != nullptr) {
|
||||
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, this->anim_pbo);
|
||||
@@ -975,6 +994,8 @@ bool OpenGLBackend::Resize(int w, int h, bool force)
|
||||
_glUseProgram(this->remap_program);
|
||||
_glUniform2f(this->remap_screen_loc, (float)_screen.width, (float)_screen.height);
|
||||
|
||||
_glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -135,6 +135,7 @@ bool VideoDriver_SDL_OpenGL::AllocateBackingStore(int w, int h, bool force)
|
||||
MemSetT(&this->dirty_rect, 0);
|
||||
|
||||
bool res = OpenGLBackend::Get()->Resize(w, h, force);
|
||||
SDL_GL_SwapWindow(this->sdl_window);
|
||||
_screen.dst_ptr = this->GetVideoPointer();
|
||||
|
||||
_cur_palette.first_dirty = 0;
|
||||
|
||||
@@ -1420,6 +1420,7 @@ bool VideoDriver_Win32OpenGL::AllocateBackingStore(int w, int h, bool force)
|
||||
|
||||
this->dirty_rect = {};
|
||||
bool res = OpenGLBackend::Get()->Resize(w, h, force);
|
||||
SwapBuffers(this->dc);
|
||||
_screen.dst_ptr = this->GetVideoPointer();
|
||||
|
||||
return res;
|
||||
|
||||
Reference in New Issue
Block a user