Skip to content

Commit

Permalink
make atlas shader built inside exectable
Browse files Browse the repository at this point in the history
  • Loading branch information
Sian Cao committed May 8, 2014
1 parent d42f9b2 commit 78a4aba
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 10 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
.*~
*.swo
build
*.pyc
17 changes: 16 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
15 changes: 14 additions & 1 deletion atlas.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 3 additions & 1 deletion driver.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}

Expand Down
16 changes: 10 additions & 6 deletions glutil.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
3 changes: 2 additions & 1 deletion glutil.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);


Expand Down

0 comments on commit 78a4aba

Please sign in to comment.