From 78a4aba76508ad3b5e2dd8072b0f20c4741c9e55 Mon Sep 17 00:00:00 2001 From: Sian Cao Date: Thu, 8 May 2014 11:24:14 +0800 Subject: [PATCH] make atlas shader built inside exectable --- .gitignore | 1 + CMakeLists.txt | 17 ++++++++++++++++- README.md | 5 +++++ atlas.cc | 15 ++++++++++++++- driver.cc | 4 +++- glutil.cc | 16 ++++++++++------ glutil.h | 3 ++- 7 files changed, 51 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 6454513..c812a63 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .*~ *.swo build +*.pyc diff --git a/CMakeLists.txt b/CMakeLists.txt index 219cb48..197ec79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,22 @@ configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_BINARY_DIR}/config.h) file(GLOB SRCS "${PROJECT_SOURCE_DIR}/*.cc") -add_executable(${target} ${SRCS}) +# make atlas shaders builtin +set(SHADERS atlas_frag.glsl.o atlas_vertex.glsl.o) +foreach(shader ${SHADERS}) +add_custom_target(${shader}) +string(REPLACE ".o" "" shader_src ${shader}) +add_custom_command(TARGET ${shader} + PRE_BUILD + COMMAND ld -r -o ${shader} -z noexecstack --format=binary ${shader_src} + COMMAND objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents + ${shader} + COMMAND mv ${shader} ${PROJECT_BINARY_DIR} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) +endforeach() + +add_executable(${target} ${SRCS} ${SHADERS}) +add_dependencies(${target} ${SHADERS}) target_link_libraries(${target} ${GLESV2_LIBRARIES} ${EGL_LIBRARIES} ${GBM_LIBRARIES} ${LIBDRM_LIBRARIES} ${FT2_LIBRARIES}) diff --git a/README.md b/README.md index c1e7950..f4effa3 100644 --- a/README.md +++ b/README.md @@ -39,3 +39,8 @@ these demos are immature and may harm your video card, try with caution. * egl_drm_tty2 demos opengl rendered on egl surface. * egl_drm_tty3 demos animated opengl on egl surface. * egl_drm_shining_circle animated circling with bad frame rate (problemmatic driver maybe) + + +TODO +==== +* provide scene mode plugin loader or just use binary blob like altas shaders diff --git a/atlas.cc b/atlas.cc index 65edd10..26ecbad 100644 --- a/atlas.cc +++ b/atlas.cc @@ -129,11 +129,24 @@ void TextMode::render_str(std::string s, float x, float y, float sx, float sy) static timeval tv_start = {0, 0}; +extern const char _binary_atlas_frag_glsl_end[]; +extern const char _binary_atlas_frag_glsl_start[]; +extern const char _binary_atlas_vertex_glsl_end[]; +extern const char _binary_atlas_vertex_glsl_start[]; + bool TextMode::init(int width, int height) { _screenWidth = width, _screenHeight = height; init_ft(); - GLProcess* proc = glprocess_create("atlas_vertex.glsl", "atlas_frag.glsl"); + + GLuint vlen = _binary_atlas_vertex_glsl_end - _binary_atlas_vertex_glsl_start; + GLuint flen = _binary_atlas_frag_glsl_end - _binary_atlas_frag_glsl_start; + cerr << "binary glsl vlen " << vlen << ", flen " << flen << endl; + + string ver_src = strndup(_binary_atlas_vertex_glsl_start, vlen); + string frag_src = strndup(_binary_atlas_frag_glsl_start, flen); + //GLProcess* proc = glprocess_create("atlas_vertex.glsl", "atlas_frag.glsl"); + GLProcess* proc = glprocess_create(ver_src.c_str(), frag_src.c_str(), true); if (!proc) return false; _proc = *proc; GLuint program = _proc.program; diff --git a/driver.cc b/driver.cc index d1c45d7..021d2ba 100644 --- a/driver.cc +++ b/driver.cc @@ -155,11 +155,12 @@ static void setup_drm() drmModeEncoder* encoder; //encoder array //open default dri device - dc.fd = open("/dev/dri/card0", O_RDWR|O_CLOEXEC|O_NONBLOCK); + dc.fd = open("/dev/dri/card1", O_RDWR|O_CLOEXEC|O_NONBLOCK); if (dc.fd <= 0) { err_quit(strerror(errno)); } + drmSetMaster(dc.fd); //acquire drm resources resources = drmModeGetResources(dc.fd); if(resources == 0) { @@ -313,6 +314,7 @@ static void cleanup() dc.saved_crtc->x, dc.saved_crtc->y, &dc.conn, 1, &dc.saved_crtc->mode); drmModeFreeCrtc(dc.saved_crtc); } + drmDropMaster(dc.fd); close(dc.fd); } diff --git a/glutil.cc b/glutil.cc index dc264c1..167bea8 100644 --- a/glutil.cc +++ b/glutil.cc @@ -45,15 +45,19 @@ static GLuint create_shader(GLenum type, const char *source) return shader_id; } -GLProcess* glprocess_create(const char *vertex_path, const char *frag_path) +GLProcess* glprocess_create(const char *vertex_path, const char *frag_path, + bool inmemory) { - string vertex_shader = load_shader(vertex_path); - if (vertex_shader.empty()) { - return nullptr; + string vertex_shader, frag_shader; + if (inmemory) { + vertex_shader = {vertex_path}; + frag_shader = {frag_path}; + } else { + vertex_shader = load_shader(vertex_path); + frag_shader = load_shader(frag_path); } - string frag_shader = load_shader(frag_path); - if (frag_shader.empty()) { + if (frag_shader.empty() || (vertex_shader.empty())) { return nullptr; } diff --git a/glutil.h b/glutil.h index 3881279..b3e1f08 100644 --- a/glutil.h +++ b/glutil.h @@ -9,7 +9,8 @@ struct GLProcess { GLuint vbo; }; -GLProcess* glprocess_create(const char *vertex_path, const char *frag_path); +GLProcess* glprocess_create(const char *vertex_path, const char *frag_path, + bool inmemory = false); void glprocess_release(GLProcess* proc);