Update API + example
This commit is contained in:
@@ -289,24 +289,11 @@ GLuint compile_shader(const char* vertex, const char* fragment)
|
||||
return programShader;
|
||||
}
|
||||
|
||||
void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex, EGLImage image)
|
||||
void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint color_tex, GLuint* depth_tex)
|
||||
{
|
||||
glGenTextures(1, color_tex);
|
||||
glGenTextures(1, depth_tex);
|
||||
glGenFramebuffers(1, fbo);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, *color_tex);
|
||||
#if 0
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, eye_width, eye_height, 0, GL_RGBA, GL_UNSIGNED_INT, NULL);
|
||||
#else
|
||||
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) eglGetProcAddress ("glEGLImageTargetTexture2DOES");
|
||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
|
||||
#endif // 0
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, *depth_tex);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, eye_width, eye_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
@@ -316,7 +303,7 @@ void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, G
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, *fbo);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *color_tex, 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_tex, 0);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depth_tex, 0);
|
||||
|
||||
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
|
||||
|
||||
@@ -37,7 +37,7 @@ void perspective(gl_ctx* ctx);
|
||||
void init_gl(gl_ctx* ctx, int w, int h);
|
||||
void draw_cube();
|
||||
GLuint compile_shader(const char* vertex, const char* fragment);
|
||||
void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex, EGLImage image);
|
||||
void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint color_tex, GLuint* depth_tex);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -157,76 +157,28 @@ int main(int argc, char** argv)
|
||||
gl_ctx gl;
|
||||
init_gl(&gl, hmd_w, hmd_h);
|
||||
|
||||
const char* vertex;
|
||||
ohmd_gets(OHMD_GLSL_DISTORTION_VERT_SRC, &vertex);
|
||||
const char* fragment;
|
||||
ohmd_gets(OHMD_GLSL_DISTORTION_FRAG_SRC, &fragment);
|
||||
|
||||
GLuint shader = compile_shader(vertex, fragment);
|
||||
glUseProgram(shader);
|
||||
glUniform1i(glGetUniformLocation(shader, "warpTexture"), 0);
|
||||
glUniform2fv(glGetUniformLocation(shader, "ViewportScale"), 1, viewport_scale);
|
||||
glUniform3fv(glGetUniformLocation(shader, "aberr"), 1, aberr_scale);
|
||||
glUseProgram(0);
|
||||
|
||||
GLuint list = gen_cubes();
|
||||
|
||||
lvrcInitRenderingEGL(compositor, gl.egl_display, gl.egl_context, gl.egl_surface);
|
||||
|
||||
int eye_w = hmd_w/2*OVERSAMPLE_SCALE;
|
||||
int eye_h = hmd_h*OVERSAMPLE_SCALE;
|
||||
|
||||
EGLint imageAttribs[] = {
|
||||
EGL_WIDTH, eye_w,
|
||||
EGL_HEIGHT, eye_h,
|
||||
EGL_DRM_BUFFER_FORMAT_MESA, EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
|
||||
EGL_DRM_BUFFER_USE_MESA, EGL_DRM_BUFFER_USE_SHARE_MESA,
|
||||
EGL_NONE
|
||||
};
|
||||
GLuint textures [2];
|
||||
|
||||
PFNEGLCREATEDRMIMAGEMESAPROC eglCreateDRMImage = (PFNEGLCREATEDRMIMAGEMESAPROC) eglGetProcAddress("eglCreateDRMImageMESA");
|
||||
bool bSwapChainInit = lvrcInitSwapChain(compositor, eye_w, eye_h, textures);
|
||||
|
||||
EGLImage left_image = eglCreateDRMImage(gl.egl_display, imageAttribs);
|
||||
EGLImage right_image = eglCreateDRMImage(gl.egl_display, imageAttribs);
|
||||
|
||||
GLuint left_color_tex = 0, left_depth_tex = 0, left_fbo = 0;
|
||||
create_fbo(eye_w, eye_h, &left_fbo, &left_color_tex, &left_depth_tex, left_image);
|
||||
|
||||
GLuint right_color_tex = 0, right_depth_tex = 0, right_fbo = 0;
|
||||
create_fbo(eye_w, eye_h, &right_fbo, &right_color_tex, &right_depth_tex, right_image);
|
||||
|
||||
PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImage = (PFNEGLEXPORTDMABUFIMAGEMESAPROC) eglGetProcAddress("eglExportDMABUFImageMESA");
|
||||
PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC eglExportDMABUFImageQuery = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) eglGetProcAddress("eglExportDMABUFImageQueryMESA");
|
||||
|
||||
#if 1
|
||||
//EGLImage left_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(left_color_tex), NULL);
|
||||
|
||||
dma_texture_params left_texture_params;
|
||||
left_texture_params.width = eye_w;
|
||||
left_texture_params.height = eye_h;
|
||||
eglExportDMABUFImageQuery(gl.egl_display, left_image, &left_texture_params.fourcc, &left_texture_params.numplanes, &left_texture_params.modifiers);
|
||||
eglExportDMABUFImage(gl.egl_display, left_image, &left_texture_params.fd, &left_texture_params.stride, &left_texture_params.offset);
|
||||
#endif // 0
|
||||
|
||||
#if 1
|
||||
//EGLImage right_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(right_color_tex), NULL);
|
||||
|
||||
dma_texture_params right_texture_params;
|
||||
right_texture_params.width = eye_w;
|
||||
right_texture_params.height = eye_h;
|
||||
eglExportDMABUFImageQuery(gl.egl_display, right_image, &right_texture_params.fourcc, &right_texture_params.numplanes, &right_texture_params.modifiers);
|
||||
eglExportDMABUFImage(gl.egl_display, right_image, &right_texture_params.fd, &right_texture_params.stride, &right_texture_params.offset);
|
||||
#endif // 0
|
||||
|
||||
extern void init_vr_context(struct lvrcInstance * compositor, dma_texture_params * left_texture_params, dma_texture_params * right_texture_params);
|
||||
init_vr_context(compositor, &left_texture_params, &right_texture_params);
|
||||
|
||||
bool bCompositorInit = lvrcInitFrameResources(compositor);
|
||||
|
||||
if (!bCompositorInit)
|
||||
if (!bSwapChainInit)
|
||||
{
|
||||
return(-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
GLuint left_color_tex = textures[0], left_depth_tex = 0, left_fbo = 0;
|
||||
create_fbo(eye_w, eye_h, &left_fbo, left_color_tex, &left_depth_tex);
|
||||
|
||||
GLuint right_color_tex = textures[1], right_depth_tex = 0, right_fbo = 0;
|
||||
create_fbo(eye_w, eye_h, &right_fbo, right_color_tex, &right_depth_tex);
|
||||
|
||||
bool done = false;
|
||||
bool crosshair_overlay = false;
|
||||
while(!done){
|
||||
@@ -290,11 +242,7 @@ int main(int argc, char** argv)
|
||||
glDisable(GL_BLEND);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
|
||||
// Setup ortho state.
|
||||
glUseProgram(shader);
|
||||
glUniform1f(glGetUniformLocation(shader, "WarpScale"), warp_scale*warp_adj);
|
||||
glUniform4fv(glGetUniformLocation(shader, "HmdWarpParam"), 1, distortion_coeffs);
|
||||
glViewport(0, 0, hmd_w, hmd_h);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glColor4d(1, 1, 1, 1);
|
||||
@@ -306,7 +254,6 @@ int main(int argc, char** argv)
|
||||
glLoadIdentity();
|
||||
|
||||
// Draw left eye
|
||||
glUniform2fv(glGetUniformLocation(shader, "LensCenter"), 1, left_lens_center);
|
||||
glBindTexture(GL_TEXTURE_2D, left_color_tex);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2d( 0, 0);
|
||||
@@ -320,7 +267,6 @@ int main(int argc, char** argv)
|
||||
glEnd();
|
||||
|
||||
// Draw right eye
|
||||
glUniform2fv(glGetUniformLocation(shader, "LensCenter"), 1, right_lens_center);
|
||||
glBindTexture(GL_TEXTURE_2D, right_color_tex);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2d( 0, 0);
|
||||
@@ -338,19 +284,14 @@ int main(int argc, char** argv)
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glUseProgram(0);
|
||||
|
||||
glFinish();
|
||||
|
||||
// Da swap-dawup!
|
||||
eglSwapBuffers(gl.egl_display, gl.egl_surface);
|
||||
|
||||
|
||||
extern void vr_context_submit_eyes(struct lvrcInstance * compositor);
|
||||
|
||||
vr_context_submit_eyes(compositor);
|
||||
|
||||
lvrcEndFrame(compositor);
|
||||
}
|
||||
|
||||
lvrcReleaseFrameResources(compositor);
|
||||
|
||||
lvrcDestroyInstance(compositor);
|
||||
|
||||
ohmd_ctx_destroy(ctx);
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
#include "vr_context.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <GL/gl.h>
|
||||
|
||||
#include <lvrc.h>
|
||||
|
||||
#include <EGL/eglext.h>
|
||||
|
||||
#include "context.inl"
|
||||
|
||||
static EGLDisplay display;
|
||||
static EGLSurface surface;
|
||||
static EGLContext context;
|
||||
|
||||
static const EGLint attribs[] =
|
||||
{
|
||||
EGL_RED_SIZE, 8,
|
||||
EGL_GREEN_SIZE, 8,
|
||||
EGL_BLUE_SIZE, 8,
|
||||
//EGL_ALPHA_SIZE, 8,
|
||||
//EGL_DEPTH_SIZE, 16,
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
static const EGLint context_attributes[] =
|
||||
{
|
||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
GLuint left_color_tex = 0;
|
||||
GLuint right_color_tex = 0;
|
||||
|
||||
void init_vr_context(struct lvrcInstance * compositor, dma_texture_params * left_texture_params, dma_texture_params * right_texture_params)
|
||||
{
|
||||
bool bSwapChainCreated = lvrcInitSwapChain(compositor);
|
||||
|
||||
if (!bSwapChainCreated)
|
||||
{
|
||||
fprintf(stderr, "swap chain not created\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//
|
||||
// Get Native Display
|
||||
EGLNativeDisplayType nativeDisplay = lvrcSwapChainGetNativeDisplay(compositor);
|
||||
|
||||
if (!nativeDisplay)
|
||||
{
|
||||
fprintf(stderr, "invalid native display\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
//
|
||||
// Get Native Window
|
||||
EGLNativeWindowType nativeWindow = lvrcSwapChainGetNativeWindow(compositor);
|
||||
|
||||
if (!nativeWindow)
|
||||
{
|
||||
fprintf(stderr, "invalid native window\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
bool bContextCreated = create_context(EGL_PLATFORM_GBM_KHR, nativeDisplay, nativeWindow, attribs, context_attributes, NULL, &display, &context, &surface);
|
||||
|
||||
if (!bContextCreated)
|
||||
{
|
||||
fprintf(stderr, "couldn't create compositor context\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) eglGetProcAddress ("glEGLImageTargetTexture2DOES");
|
||||
|
||||
//
|
||||
// LEFT
|
||||
EGLAttrib attrib_list_left[] =
|
||||
{
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT, left_texture_params->fd,
|
||||
EGL_DMA_BUF_PLANE0_PITCH_EXT, left_texture_params->stride,
|
||||
EGL_DMA_BUF_PLANE0_OFFSET_EXT, left_texture_params->offset,
|
||||
EGL_WIDTH, left_texture_params->width,
|
||||
EGL_HEIGHT, left_texture_params->height,
|
||||
EGL_LINUX_DRM_FOURCC_EXT, left_texture_params->fourcc,
|
||||
//EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, left_texture_params->modifiers & 0xFFFFFFFF,
|
||||
//EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, left_texture_params->modifiers >> 32,
|
||||
EGL_NONE,
|
||||
};
|
||||
|
||||
EGLImage image_left = eglCreateImage(display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attrib_list_left);
|
||||
|
||||
glGenTextures(1, &left_color_tex);
|
||||
glBindTexture(GL_TEXTURE_2D, left_color_tex);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image_left);
|
||||
assert(glGetError() == GL_NO_ERROR);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
//
|
||||
// RIGHT
|
||||
EGLAttrib attrib_list_right[] =
|
||||
{
|
||||
EGL_DMA_BUF_PLANE0_FD_EXT, right_texture_params->fd,
|
||||
EGL_DMA_BUF_PLANE0_PITCH_EXT, right_texture_params->stride,
|
||||
EGL_DMA_BUF_PLANE0_OFFSET_EXT, right_texture_params->offset,
|
||||
EGL_WIDTH, right_texture_params->width,
|
||||
EGL_HEIGHT, right_texture_params->height,
|
||||
EGL_LINUX_DRM_FOURCC_EXT, right_texture_params->fourcc,
|
||||
//EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, right_texture_params->modifiers & 0xFFFFFFFF,
|
||||
//EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, right_texture_params->modifiers >> 32,
|
||||
EGL_NONE,
|
||||
};
|
||||
|
||||
EGLImage image_right = eglCreateImage(display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attrib_list_right);
|
||||
|
||||
glGenTextures(1, &right_color_tex);
|
||||
glBindTexture(GL_TEXTURE_2D, right_color_tex);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image_right);
|
||||
assert(glGetError() == GL_NO_ERROR);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
void vr_context_submit_eyes(struct lvrcInstance * compositor)
|
||||
{
|
||||
eglMakeCurrent(display, surface, surface, context);
|
||||
|
||||
glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
// Draw left eye
|
||||
lvrcSubmitFrameLeft(compositor, left_color_tex);
|
||||
|
||||
// Draw right eye
|
||||
lvrcSubmitFrameRight(compositor, right_color_tex);
|
||||
|
||||
eglSwapBuffers(display, surface);
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int fd;
|
||||
int width;
|
||||
int height;
|
||||
int stride;
|
||||
int offset;
|
||||
int fourcc;
|
||||
int numplanes;
|
||||
unsigned long int modifiers;
|
||||
} dma_texture_params;
|
||||
Reference in New Issue
Block a user