diff --git a/client/main.c b/client/main.c index 1ba82d8b..0b52430d 100644 --- a/client/main.c +++ b/client/main.c @@ -381,7 +381,9 @@ int frameThread(void * unused) size_t dataSize; switch(header.type) { - case FRAME_TYPE_ARGB: + case FRAME_TYPE_RGBA: + case FRAME_TYPE_BGRA: + case FRAME_TYPE_RGBA10: dataSize = lgrFormat.height * lgrFormat.pitch; lgrFormat.bpp = 32; break; diff --git a/client/renderers/egl.c b/client/renderers/egl.c index c776989b..604aea72 100644 --- a/client/renderers/egl.c +++ b/client/renderers/egl.c @@ -278,12 +278,24 @@ bool egl_on_frame_event(void * opaque, const LG_RendererFormat format, const uin switch(format.type) { - case FRAME_TYPE_ARGB: + case FRAME_TYPE_BGRA: + this->pixFmt = EGL_PF_BGRA; + this->shader = this->shaders.bgra; + this->frameSize = format.height * format.pitch; + break; + + case FRAME_TYPE_RGBA: this->pixFmt = EGL_PF_RGBA; this->shader = this->shaders.rgba; this->frameSize = format.height * format.pitch; break; + case FRAME_TYPE_RGBA10: + this->pixFmt = EGL_PF_RGBA10; + this->shader = this->shaders.rgba; + this->frameSize = format.height * format.pitch; + break; + case FRAME_TYPE_YUV420: this->pixFmt = EGL_PF_YUV420; this->shader = this->shaders.yuv; @@ -291,6 +303,7 @@ bool egl_on_frame_event(void * opaque, const LG_RendererFormat format, const uin break; default: + DEBUG_ERROR("Unsupported frame format"); return false; } diff --git a/client/renderers/egl_shader_progs.h b/client/renderers/egl_shader_progs.h index 528d0529..3e38d92f 100644 --- a/client/renderers/egl_shader_progs.h +++ b/client/renderers/egl_shader_progs.h @@ -112,11 +112,7 @@ uniform sampler2D sampler1;\ \ void main()\ {\ - highp vec4 tmp = texture(sampler1, uv);\ - color.r = tmp.b;\ - color.g = tmp.g;\ - color.b = tmp.r;\ - color.a = tmp.a;\ + color = texture(sampler1, uv);\ }\ "; diff --git a/client/renderers/egl_texture.c b/client/renderers/egl_texture.c index d337e543..a75266e3 100644 --- a/client/renderers/egl_texture.c +++ b/client/renderers/egl_texture.c @@ -38,7 +38,9 @@ struct EGL_Texture GLuint samplers[3]; size_t planes[3][2]; GLintptr offsets[3]; + GLenum intFormat; GLenum format; + GLenum dataType; bool hasPBO; GLuint pbo[2]; @@ -91,13 +93,34 @@ bool egl_texture_setup(EGL_Texture * texture, enum EGL_PixelFormat pixFmt, size_ switch(pixFmt) { - case EGL_PF_RGBA: case EGL_PF_BGRA: textureCount = 1; texture->format = GL_BGRA; texture->planes[0][0] = width; texture->planes[0][1] = height; texture->offsets[0] = 0; + texture->intFormat = GL_BGRA; + texture->dataType = GL_UNSIGNED_BYTE; + break; + + case EGL_PF_RGBA: + textureCount = 1; + texture->format = GL_RGBA; + texture->planes[0][0] = width; + texture->planes[0][1] = height; + texture->offsets[0] = 0; + texture->intFormat = GL_BGRA; + texture->dataType = GL_UNSIGNED_BYTE; + break; + + case EGL_PF_RGBA10: + textureCount = 1; + texture->format = GL_RGBA; + texture->planes[0][0] = width; + texture->planes[0][1] = height; + texture->offsets[0] = 0; + texture->intFormat = GL_RGB10_A2; + texture->dataType = GL_UNSIGNED_INT_2_10_10_10_REV; break; case EGL_PF_YUV420: @@ -112,6 +135,7 @@ bool egl_texture_setup(EGL_Texture * texture, enum EGL_PixelFormat pixFmt, size_ texture->offsets[0] = 0; texture->offsets[1] = width * height; texture->offsets[2] = texture->offsets[1] + (texture->offsets[1] / 4); + texture->dataType = GL_UNSIGNED_BYTE; break; default: @@ -140,8 +164,8 @@ bool egl_texture_setup(EGL_Texture * texture, enum EGL_PixelFormat pixFmt, size_ glSamplerParameteri(texture->samplers[i], GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, texture->textures[i]); - glTexImage2D(GL_TEXTURE_2D, 0, texture->format, texture->planes[i][0], texture->planes[i][1], - 0, texture->format, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, texture->intFormat, texture->planes[i][0], texture->planes[i][1], + 0, texture->format, texture->dataType, NULL); } glBindTexture(GL_TEXTURE_2D, 0); @@ -194,7 +218,7 @@ bool egl_texture_update(EGL_Texture * texture, const uint8_t * buffer) { glBindTexture(GL_TEXTURE_2D, texture->textures[i]); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture->planes[i][0], texture->planes[i][1], - texture->format, GL_UNSIGNED_BYTE, buffer + texture->offsets[i]); + texture->format, texture->dataType, buffer + texture->offsets[i]); } glBindTexture(GL_TEXTURE_2D, 0); } @@ -210,7 +234,7 @@ void egl_texture_bind(EGL_Texture * texture) { glBindTexture(GL_TEXTURE_2D, texture->textures[i]); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture->planes[i][0], texture->planes[i][1], - texture->format, GL_UNSIGNED_BYTE, (const void *)texture->offsets[i]); + texture->format, texture->dataType, (const void *)texture->offsets[i]); } glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); diff --git a/client/renderers/egl_texture.h b/client/renderers/egl_texture.h index 7a51d126..8871b8df 100644 --- a/client/renderers/egl_texture.h +++ b/client/renderers/egl_texture.h @@ -31,6 +31,7 @@ enum EGL_PixelFormat { EGL_PF_RGBA, EGL_PF_BGRA, + EGL_PF_RGBA10, EGL_PF_YUV420 }; diff --git a/client/renderers/opengl.c b/client/renderers/opengl.c index cc56293e..e4316575 100644 --- a/client/renderers/opengl.c +++ b/client/renderers/opengl.c @@ -878,7 +878,8 @@ static bool configure(struct Inst * this, SDL_Window *window) switch(this->format.type) { - case FRAME_TYPE_ARGB: + case FRAME_TYPE_BGRA: + case FRAME_TYPE_RGBA: this->decoder = &LGD_NULL; break; diff --git a/common/KVMFR.h b/common/KVMFR.h index 9f19ad9c..0e46c06e 100644 --- a/common/KVMFR.h +++ b/common/KVMFR.h @@ -21,12 +21,14 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include #define KVMFR_HEADER_MAGIC "[[KVMFR]]" -#define KVMFR_HEADER_VERSION 7 +#define KVMFR_HEADER_VERSION 8 typedef enum FrameType { FRAME_TYPE_INVALID , - FRAME_TYPE_ARGB , // ABGR interleaved: A,R,G,B 32bpp + FRAME_TYPE_BGRA , // BGRA interleaved: B,G,R,A 32bpp + FRAME_TYPE_RGBA , // RGBA interleaved: R,G,B,A 32bpp + FRAME_TYPE_RGBA10 , // RGBA interleaved: R,G,B,A 10,10,10,2 bpp FRAME_TYPE_YUV420 , // YUV420 FRAME_TYPE_H264 , // H264 compressed FRAME_TYPE_MAX , // sentinel value