From 877624573d656277a8a108de7e4eafdb8bc9361d Mon Sep 17 00:00:00 2001 From: Logan McNaughton Date: Mon, 7 Jun 2021 21:43:50 -0600 Subject: [PATCH] update parallel rdp --- parallel-rdp-standalone/gfx_m64p.c | 1 + parallel-rdp-standalone/glguts.c | 40 +++++++++++++++++++++--- parallel-rdp-standalone/glguts.h | 3 +- parallel-rdp-standalone/parallel_imp.cpp | 12 +++---- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/parallel-rdp-standalone/gfx_m64p.c b/parallel-rdp-standalone/gfx_m64p.c index 6dd5359..fb1c870 100644 --- a/parallel-rdp-standalone/gfx_m64p.c +++ b/parallel-rdp-standalone/gfx_m64p.c @@ -302,6 +302,7 @@ EXPORT void CALL ResizeVideoOutput(int width, int height) { window_width = width; window_height = height; + window_changed = true; } EXPORT void CALL FBWrite(unsigned int addr, unsigned int size) diff --git a/parallel-rdp-standalone/glguts.c b/parallel-rdp-standalone/glguts.c index f4f9b66..859cdf7 100644 --- a/parallel-rdp-standalone/glguts.c +++ b/parallel-rdp-standalone/glguts.c @@ -38,8 +38,15 @@ static PFNGLDELETEPROGRAMPROC glDeleteProgram; static PFNGLUSEPROGRAMPROC glUseProgram; static PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; static PFNGLBINDVERTEXARRAYPROC glBindVertexArray; +static PFNGLBINDBUFFERPROC glBindBuffer; +static PFNGLGENBUFFERSPROC glGenBuffers; +static PFNGLDELETEBUFFERSPROC glDeleteBuffers; +static PFNGLBUFFERSTORAGEPROC glBufferStorage; +static PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +static PFNGLUNMAPBUFFERPROC glUnmapBuffer; static bool toggle_fs; +bool window_changed; // framebuffer texture states int32_t window_width; @@ -52,7 +59,9 @@ int32_t window_fullscreen; static GLuint program; static GLuint vao; +static GLuint buffer; static GLuint texture; +static uint8_t *buffer_data; int32_t tex_width; int32_t tex_height; @@ -165,13 +174,13 @@ bool screen_write(struct frame_buffer *fb) glPixelStorei(GL_UNPACK_ROW_LENGTH, fb->pitch); // reallocate texture buffer on GPU glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_width, - tex_height, 0, TEX_FORMAT, TEX_TYPE, fb->pixels); + tex_height, 0, TEX_FORMAT, TEX_TYPE, 0); } else { // copy local buffer to GPU texture buffer glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex_width, tex_height, - TEX_FORMAT, TEX_TYPE, fb->pixels); + TEX_FORMAT, TEX_TYPE, 0); } return buffer_size_changed; @@ -232,13 +241,22 @@ void gl_screen_close(void) tex_width = 0; tex_height = 0; + glUnmapBuffer(buffer); glDeleteTextures(1, &texture); glDeleteVertexArrays(1, &vao); + glDeleteBuffers(1, &buffer); glDeleteProgram(program); } +uint8_t* screen_get_texture_data() +{ + return buffer_data; +} + void screen_init() { + toggle_fs = false; + window_changed = false; /* Get the core Video Extension function pointers from the library handle */ CoreVideo_Init = (ptr_VidExt_Init)DLSYM(CoreLibHandle, "VidExt_Init"); CoreVideo_Quit = (ptr_VidExt_Quit)DLSYM(CoreLibHandle, "VidExt_Quit"); @@ -278,6 +296,12 @@ void screen_init() glUseProgram = (PFNGLUSEPROGRAMPROC) CoreVideo_GL_GetProcAddress("glUseProgram"); glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) CoreVideo_GL_GetProcAddress("glGenVertexArrays"); glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) CoreVideo_GL_GetProcAddress("glBindVertexArray"); + glBindBuffer = (PFNGLBINDBUFFERPROC) CoreVideo_GL_GetProcAddress("glBindBuffer"); + glGenBuffers = (PFNGLGENBUFFERSPROC) CoreVideo_GL_GetProcAddress("glGenBuffers"); + glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) CoreVideo_GL_GetProcAddress("glDeleteBuffers"); + glBufferStorage = (PFNGLBUFFERSTORAGEPROC) CoreVideo_GL_GetProcAddress("glBufferStorage"); + glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) CoreVideo_GL_GetProcAddress("glMapBufferRange"); + glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) CoreVideo_GL_GetProcAddress("glUnmapBuffer"); // shader sources for drawing a clipped full-screen triangle. the geometry // is defined by the vertex ID, so a VBO is not required. @@ -314,6 +338,11 @@ void screen_init() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glGenBuffers(1, &buffer); + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer); + glBufferStorage(GL_PIXEL_UNPACK_BUFFER, 640 * 640 * sizeof(uint32_t), 0, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + buffer_data = glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 640 * 640 * sizeof(uint32_t), GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + // check if there was an error when using any of the commands above gl_check_errors(); } @@ -326,8 +355,11 @@ void screen_swap(bool blank) toggle_fs = false; } - // clear current buffer, indicating the start of a new frame - gl_screen_clear(); + if (window_changed || blank) + { + gl_screen_clear(); + window_changed = false; + } if (!blank) { diff --git a/parallel-rdp-standalone/glguts.h b/parallel-rdp-standalone/glguts.h index 0611081..53c4721 100644 --- a/parallel-rdp-standalone/glguts.h +++ b/parallel-rdp-standalone/glguts.h @@ -33,11 +33,12 @@ extern "C" void screen_toggle_fullscreen(void); void screen_close(void); void screen_swap(bool blank); + uint8_t* screen_get_texture_data(); extern int32_t window_width; extern int32_t window_height; extern int32_t window_fullscreen; - extern bool window_vsync; + extern bool window_changed; #ifdef __cplusplus } diff --git a/parallel-rdp-standalone/parallel_imp.cpp b/parallel-rdp-standalone/parallel_imp.cpp index 64941cd..b146008 100644 --- a/parallel-rdp-standalone/parallel_imp.cpp +++ b/parallel-rdp-standalone/parallel_imp.cpp @@ -36,7 +36,7 @@ static const unsigned cmd_len_lut[64] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; -void vk_blit(std::vector &colors, unsigned &width, unsigned &height) +void vk_blit(unsigned &width, unsigned &height) { if (running) { @@ -56,20 +56,20 @@ void vk_blit(std::vector &colors, unsigned &width, unsigned &height) RDP::VIScanoutBuffer scanout; frontend->scanout_async_buffer(scanout, opts); + uint8_t* color_data = screen_get_texture_data(); if (!scanout.width || !scanout.height) { width = 0; height = 0; - colors.clear(); + memset(color_data, 0, width * height * sizeof(uint32_t)); return; } width = scanout.width; height = scanout.height; - colors.resize(width * height); scanout.fence->wait(); - memcpy(colors.data(), device->map_host_buffer(*scanout.buffer, Vulkan::MEMORY_ACCESS_READ_BIT), + memcpy(color_data, device->map_host_buffer(*scanout.buffer, Vulkan::MEMORY_ACCESS_READ_BIT), width * height * sizeof(uint32_t)); device->unmap_host_buffer(*scanout.buffer, Vulkan::MEMORY_ACCESS_READ_BIT); } @@ -104,8 +104,7 @@ void vk_rasterize() unsigned width = 0; unsigned height = 0; - std::vector cols; - vk_blit(cols, width, height); + vk_blit(width, height); if (width == 0 || height == 0) { @@ -114,7 +113,6 @@ void vk_rasterize() } struct frame_buffer buf = {0}; - buf.pixels = (video_pixel *)cols.data(); buf.valid = true; buf.height = height; buf.width = width;