mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-12-23 14:03:40 +00:00
[client] egl: cleanup/refactor of cursor texture code
This commit is contained in:
parent
12da2fc0b7
commit
cd4dfd7252
@ -34,6 +34,14 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "cursor_rgb.frag.h"
|
#include "cursor_rgb.frag.h"
|
||||||
#include "cursor_mono.frag.h"
|
#include "cursor_mono.frag.h"
|
||||||
|
|
||||||
|
struct CursorTex
|
||||||
|
{
|
||||||
|
struct EGL_Texture * texture;
|
||||||
|
struct EGL_Shader * shader;
|
||||||
|
GLuint uMousePos;
|
||||||
|
GLuint uCBMode;
|
||||||
|
};
|
||||||
|
|
||||||
struct EGL_Cursor
|
struct EGL_Cursor
|
||||||
{
|
{
|
||||||
LG_Lock lock;
|
LG_Lock lock;
|
||||||
@ -50,23 +58,46 @@ struct EGL_Cursor
|
|||||||
float x, y, w, h;
|
float x, y, w, h;
|
||||||
int cbMode;
|
int cbMode;
|
||||||
|
|
||||||
// textures
|
struct CursorTex norm;
|
||||||
struct EGL_Texture * texture;
|
struct CursorTex mono;
|
||||||
struct EGL_Texture * textureMono;
|
|
||||||
|
|
||||||
// shaders
|
|
||||||
struct EGL_Shader * shader;
|
|
||||||
struct EGL_Shader * shaderMono;
|
|
||||||
|
|
||||||
// uniforms
|
|
||||||
GLuint uMousePos;
|
|
||||||
GLuint uMousePosMono;
|
|
||||||
GLuint uCBMode;
|
|
||||||
|
|
||||||
// model
|
|
||||||
struct EGL_Model * model;
|
struct EGL_Model * model;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool egl_cursor_tex_init(struct CursorTex * t,
|
||||||
|
const char * vertex_code , size_t vertex_size,
|
||||||
|
const char * fragment_code, size_t fragment_size)
|
||||||
|
{
|
||||||
|
if (!egl_texture_init(&t->texture, NULL))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to initialize the cursor texture");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!egl_shader_init(&t->shader))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to initialize the cursor shader");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!egl_shader_compile(t->shader,
|
||||||
|
vertex_code, vertex_size, fragment_code, fragment_size))
|
||||||
|
{
|
||||||
|
DEBUG_ERROR("Failed to compile the cursor shader");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
t->uMousePos = egl_shader_get_uniform_location(t->shader, "mouse" );
|
||||||
|
t->uCBMode = egl_shader_get_uniform_location(t->shader, "cbMode");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void egl_cursor_tex_free(struct CursorTex * t)
|
||||||
|
{
|
||||||
|
egl_texture_free(&t->texture);
|
||||||
|
egl_shader_free (&t->shader );
|
||||||
|
};
|
||||||
|
|
||||||
bool egl_cursor_init(EGL_Cursor ** cursor)
|
bool egl_cursor_init(EGL_Cursor ** cursor)
|
||||||
{
|
{
|
||||||
*cursor = (EGL_Cursor *)malloc(sizeof(EGL_Cursor));
|
*cursor = (EGL_Cursor *)malloc(sizeof(EGL_Cursor));
|
||||||
@ -79,52 +110,15 @@ bool egl_cursor_init(EGL_Cursor ** cursor)
|
|||||||
memset(*cursor, 0, sizeof(EGL_Cursor));
|
memset(*cursor, 0, sizeof(EGL_Cursor));
|
||||||
LG_LOCK_INIT((*cursor)->lock);
|
LG_LOCK_INIT((*cursor)->lock);
|
||||||
|
|
||||||
if (!egl_texture_init(&(*cursor)->texture, NULL))
|
if (!egl_cursor_tex_init(&(*cursor)->norm,
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to initialize the cursor texture");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!egl_texture_init(&(*cursor)->textureMono, NULL))
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to initialize the cursor mono texture");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!egl_shader_init(&(*cursor)->shader))
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to initialize the cursor shader");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!egl_shader_init(&(*cursor)->shaderMono))
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to initialize the cursor mono shader");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!egl_shader_compile(
|
|
||||||
(*cursor)->shader,
|
|
||||||
b_shader_cursor_vert , b_shader_cursor_vert_size,
|
b_shader_cursor_vert , b_shader_cursor_vert_size,
|
||||||
b_shader_cursor_rgb_frag, b_shader_cursor_rgb_frag_size))
|
b_shader_cursor_rgb_frag, b_shader_cursor_rgb_frag_size))
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to compile the cursor shader");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if (!egl_shader_compile(
|
if (!egl_cursor_tex_init(&(*cursor)->mono,
|
||||||
(*cursor)->shaderMono,
|
|
||||||
b_shader_cursor_vert , b_shader_cursor_vert_size,
|
b_shader_cursor_vert , b_shader_cursor_vert_size,
|
||||||
b_shader_cursor_mono_frag, b_shader_cursor_mono_frag_size))
|
b_shader_cursor_mono_frag, b_shader_cursor_mono_frag_size))
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to compile the cursor mono shader");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
(*cursor)->uMousePos = egl_shader_get_uniform_location((*cursor)->shader , "mouse" );
|
|
||||||
(*cursor)->uCBMode = egl_shader_get_uniform_location((*cursor)->shader , "cbMode");
|
|
||||||
|
|
||||||
(*cursor)->uMousePosMono = egl_shader_get_uniform_location((*cursor)->shaderMono, "mouse" );
|
|
||||||
|
|
||||||
if (!egl_model_init(&(*cursor)->model))
|
if (!egl_model_init(&(*cursor)->model))
|
||||||
{
|
{
|
||||||
@ -148,11 +142,9 @@ void egl_cursor_free(EGL_Cursor ** cursor)
|
|||||||
if ((*cursor)->data)
|
if ((*cursor)->data)
|
||||||
free((*cursor)->data);
|
free((*cursor)->data);
|
||||||
|
|
||||||
egl_texture_free(&(*cursor)->texture );
|
egl_cursor_tex_free(&(*cursor)->norm);
|
||||||
egl_texture_free(&(*cursor)->textureMono);
|
egl_cursor_tex_free(&(*cursor)->mono);
|
||||||
egl_shader_free (&(*cursor)->shader );
|
egl_model_free(&(*cursor)->model);
|
||||||
egl_shader_free (&(*cursor)->shaderMono );
|
|
||||||
egl_model_free (&(*cursor)->model );
|
|
||||||
|
|
||||||
free(*cursor);
|
free(*cursor);
|
||||||
*cursor = NULL;
|
*cursor = NULL;
|
||||||
@ -222,9 +214,9 @@ void egl_cursor_render(EGL_Cursor * cursor)
|
|||||||
|
|
||||||
case LG_CURSOR_COLOR:
|
case LG_CURSOR_COLOR:
|
||||||
{
|
{
|
||||||
egl_texture_setup(cursor->texture, EGL_PF_BGRA, cursor->width, cursor->height, cursor->stride, false, false);
|
egl_texture_setup(cursor->norm.texture, EGL_PF_BGRA, cursor->width, cursor->height, cursor->stride, false, false);
|
||||||
egl_texture_update(cursor->texture, data);
|
egl_texture_update(cursor->norm.texture, data);
|
||||||
egl_model_set_texture(cursor->model, cursor->texture);
|
egl_model_set_texture(cursor->model, cursor->norm.texture);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,10 +238,10 @@ void egl_cursor_render(EGL_Cursor * cursor)
|
|||||||
xor[y * cursor->width + x] = xorMask;
|
xor[y * cursor->width + x] = xorMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
egl_texture_setup (cursor->texture , EGL_PF_BGRA, cursor->width, cursor->height, cursor->width * 4, false, false);
|
egl_texture_setup (cursor->norm.texture , EGL_PF_BGRA, cursor->width, cursor->height, cursor->width * 4, false, false);
|
||||||
egl_texture_setup (cursor->textureMono, EGL_PF_BGRA, cursor->width, cursor->height, cursor->width * 4, false, false);
|
egl_texture_setup (cursor->mono.texture, EGL_PF_BGRA, cursor->width, cursor->height, cursor->width * 4, false, false);
|
||||||
egl_texture_update(cursor->texture , (uint8_t *)and);
|
egl_texture_update(cursor->norm.texture , (uint8_t *)and);
|
||||||
egl_texture_update(cursor->textureMono, (uint8_t *)xor);
|
egl_texture_update(cursor->mono.texture, (uint8_t *)xor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -261,26 +253,26 @@ void egl_cursor_render(EGL_Cursor * cursor)
|
|||||||
{
|
{
|
||||||
case LG_CURSOR_MONOCHROME:
|
case LG_CURSOR_MONOCHROME:
|
||||||
{
|
{
|
||||||
egl_shader_use(cursor->shader);
|
egl_shader_use(cursor->norm.shader);
|
||||||
glUniform4f(cursor->uMousePos, cursor->x, cursor->y, cursor->w, cursor->h / 2);
|
glUniform4f(cursor->norm.uMousePos, cursor->x, cursor->y, cursor->w, cursor->h / 2);
|
||||||
glUniform1i(cursor->uCBMode , cursor->cbMode);
|
glUniform1i(cursor->norm.uCBMode , cursor->cbMode);
|
||||||
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
|
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
|
||||||
egl_model_set_texture(cursor->model, cursor->texture);
|
egl_model_set_texture(cursor->model, cursor->norm.texture);
|
||||||
egl_model_render(cursor->model);
|
egl_model_render(cursor->model);
|
||||||
|
|
||||||
egl_shader_use(cursor->shaderMono);
|
egl_shader_use(cursor->mono.shader);
|
||||||
glUniform4f(cursor->uMousePosMono, cursor->x, cursor->y, cursor->w, cursor->h / 2);
|
glUniform4f(cursor->mono.uMousePos, cursor->x, cursor->y, cursor->w, cursor->h / 2);
|
||||||
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
|
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
|
||||||
egl_model_set_texture(cursor->model, cursor->textureMono);
|
egl_model_set_texture(cursor->model, cursor->mono.texture);
|
||||||
egl_model_render(cursor->model);
|
egl_model_render(cursor->model);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case LG_CURSOR_COLOR:
|
case LG_CURSOR_COLOR:
|
||||||
{
|
{
|
||||||
egl_shader_use(cursor->shader);
|
egl_shader_use(cursor->norm.shader);
|
||||||
glUniform4f(cursor->uMousePos, cursor->x, cursor->y, cursor->w, cursor->h);
|
glUniform4f(cursor->norm.uMousePos, cursor->x, cursor->y, cursor->w, cursor->h);
|
||||||
glUniform1i(cursor->uCBMode , cursor->cbMode);
|
glUniform1i(cursor->norm.uCBMode , cursor->cbMode);
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
egl_model_render(cursor->model);
|
egl_model_render(cursor->model);
|
||||||
break;
|
break;
|
||||||
@ -288,8 +280,8 @@ void egl_cursor_render(EGL_Cursor * cursor)
|
|||||||
|
|
||||||
case LG_CURSOR_MASKED_COLOR:
|
case LG_CURSOR_MASKED_COLOR:
|
||||||
{
|
{
|
||||||
egl_shader_use(cursor->shaderMono);
|
egl_shader_use(cursor->mono.shader);
|
||||||
glUniform4f(cursor->uMousePos, cursor->x, cursor->y, cursor->w, cursor->h);
|
glUniform4f(cursor->mono.uMousePos, cursor->x, cursor->y, cursor->w, cursor->h);
|
||||||
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
|
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
|
||||||
egl_model_render(cursor->model);
|
egl_model_render(cursor->model);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user