Created
December 29, 2016 16:08
-
-
Save ReneHollander/0d3025d26deb8e989270d80657233841 to your computer and use it in GitHub Desktop.
Skia on the Raspberry Pi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <assert.h> | |
#include <stdio.h> | |
#include <cstdio> | |
#include <bcm_host.h> | |
#include <EGL/egl.h> | |
#include <EGL/eglext.h> | |
#include <GLES2/gl2.h> | |
#include <GLES2/gl2ext.h> | |
#include "GrContext.h" | |
#include "gl/GrGLInterface.h" | |
#include "SkData.h" | |
#include "SkImage.h" | |
#include "SkStream.h" | |
#include "SkSurface.h" | |
#include "SkCanvas.h" | |
#include "SkPaint.h" | |
typedef struct { | |
uint32_t screen_width; | |
uint32_t screen_height; | |
EGLDisplay display; | |
EGLSurface surface; | |
EGLContext context; | |
} CUBE_STATE_T; | |
static CUBE_STATE_T _state, *state=&_state; | |
static void init_ogl(CUBE_STATE_T *state) { | |
int32_t success = 0; | |
EGLBoolean result; | |
EGLint num_config; | |
static EGL_DISPMANX_WINDOW_T nativewindow; | |
DISPMANX_ELEMENT_HANDLE_T dispman_element; | |
DISPMANX_DISPLAY_HANDLE_T dispman_display; | |
DISPMANX_UPDATE_HANDLE_T dispman_update; | |
VC_RECT_T dst_rect; | |
VC_RECT_T src_rect; | |
static const EGLint attribute_list[] = { | |
EGL_RED_SIZE, 8, | |
EGL_GREEN_SIZE, 8, | |
EGL_BLUE_SIZE, 8, | |
EGL_ALPHA_SIZE, 8, | |
EGL_DEPTH_SIZE, 0, | |
EGL_STENCIL_SIZE, 8, | |
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, | |
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, | |
EGL_NONE | |
}; | |
const EGLint context_attrib_list[] = { | |
EGL_CONTEXT_CLIENT_VERSION, 2, | |
EGL_NONE | |
}; | |
EGLConfig config; | |
state->display = eglGetDisplay(EGL_DEFAULT_DISPLAY); | |
assert(state->display!=EGL_NO_DISPLAY); | |
result = eglInitialize(state->display, NULL, NULL); | |
assert(EGL_FALSE != result); | |
result = eglChooseConfig(state->display, attribute_list, &config, 1, &num_config); | |
assert(EGL_FALSE != result); | |
result = eglBindAPI(EGL_OPENGL_ES_API); | |
assert(EGL_FALSE != result); | |
state->context = eglCreateContext(state->display, config, EGL_NO_CONTEXT, context_attrib_list); | |
assert(state->context!=EGL_NO_CONTEXT); | |
success = graphics_get_display_size(0, &state->screen_width, &state->screen_height); | |
assert( success >= 0 ); | |
dst_rect.x = 0; | |
dst_rect.y = 0; | |
dst_rect.width = state->screen_width; | |
dst_rect.height = state->screen_height; | |
src_rect.x = 0; | |
src_rect.y = 0; | |
src_rect.width = state->screen_width << 16; | |
src_rect.height = state->screen_height << 16; | |
dispman_display = vc_dispmanx_display_open( 0 /* LCD */); | |
dispman_update = vc_dispmanx_update_start( 0 ); | |
dispman_element = vc_dispmanx_element_add ( dispman_update, dispman_display, 0, &dst_rect, 0, &src_rect, DISPMANX_PROTECTION_NONE, 0, 0, DISPMANX_NO_ROTATE); | |
nativewindow.element = dispman_element; | |
nativewindow.width = state->screen_width; | |
nativewindow.height = state->screen_height; | |
vc_dispmanx_update_submit_sync( dispman_update ); | |
state->surface = eglCreateWindowSurface( state->display, config, &nativewindow, NULL ); | |
assert(state->surface != EGL_NO_SURFACE); | |
result = eglMakeCurrent(state->display, state->surface, state->surface, state->context); | |
assert(EGL_FALSE != result); | |
} | |
static void exit_func(void) { | |
eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); | |
eglDestroySurface( state->display, state->surface ); | |
eglDestroyContext( state->display, state->context ); | |
eglTerminate( state->display ); | |
bcm_host_deinit(); | |
} | |
int main(int argc, char *argv[]) { | |
bcm_host_init(); | |
memset( state, 0, sizeof( *state ) ); | |
init_ogl(state); | |
printf("EGL Information:\n"); | |
printf("\tVendor:\t\t%s\n", eglQueryString(state->display, EGL_VENDOR)); | |
printf("\tVersion:\t%s\n", eglQueryString(state->display, EGL_VERSION)); | |
printf("\tClient APIs:\t%s\n", eglQueryString(state->display, EGL_CLIENT_APIS)); | |
printf("\tExtensions:\t%s\n", eglQueryString(state->display, EGL_EXTENSIONS)); | |
printf("\n"); | |
printf("OpenGL Information:\n"); | |
printf("\tVendor:\t\t%s\n", glGetString(GL_VENDOR)); | |
printf("\tRenderer:\t%s\n", glGetString(GL_RENDERER)); | |
printf("\tVersion:\t%s\n", glGetString(GL_VERSION)); | |
printf("\tExtensions:\t%s\n", glGetString(GL_EXTENSIONS)); | |
printf("\n"); | |
glViewport(0, 0, (GLsizei) state->screen_width, (GLsizei) state->screen_height); | |
glClearColor(1, 0, 0, 1); | |
glClearStencil(0); | |
glStencilMask(0xffffffff); | |
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | |
sk_sp<const GrGLInterface> interface(GrGLCreateNativeInterface()); | |
sk_sp<GrContext> grContext(GrContext::Create(kOpenGL_GrBackend, (GrBackendContext)interface.get())); | |
GrBackendRenderTargetDesc desc; | |
desc.fWidth = state->screen_width; | |
desc.fHeight = state->screen_height; | |
desc.fConfig = kSkia8888_GrPixelConfig; | |
desc.fOrigin = kBottomLeft_GrSurfaceOrigin; | |
desc.fSampleCnt = 0; | |
desc.fStencilBits = 8; | |
desc.fRenderTargetHandle = 0; | |
SkSurface *surface = SkSurface::MakeFromBackendRenderTarget(grContext.release(), desc, nullptr, nullptr).release(); | |
SkCanvas *canvas = surface->getCanvas(); | |
canvas->clear(SK_ColorBLUE); | |
// SkRect rect = SkRect::MakeXYWH(0, 0, 100, 100); | |
// SkPaint paint; | |
// paint.setColor(SK_ColorBLUE); | |
// canvas->drawRect(rect, paint); | |
canvas->flush(); | |
eglSwapBuffers(state->display, state->surface); | |
getchar(); | |
exit_func(); | |
printf("Finished!\n"); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
EGL Information: | |
Vendor: Broadcom | |
Version: 1.4 | |
Client APIs: OpenGL_ES OpenVG | |
Extensions: EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_vg_parent_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_lock_surface | |
OpenGL Information: | |
Vendor: Broadcom | |
Renderer: VideoCore IV HW | |
Version: OpenGL ES 2.0 | |
Extensions: GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_texture_npot GL_OES_depth24 GL_OES_vertex_half_float GL_OES_EGL_image GL_OES_EGL_image_external GL_EXT_discard_framebuffer GL_OES_rgb8_rgba8 GL_OES_depth32 GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_APPLE_rgb_422 GL_EXT_debug_marker | |
ERROR:LEX/PARSE-2 (vertex shader, line 12) Undefined identifier../../src/gpu/gl/builders/GrGLProgramBuilder.cpp:207: fatal error: "Error linking program" | |
Aborted |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
EGL Information: | |
Vendor: Broadcom | |
Version: 1.4 | |
Client APIs: OpenGL_ES OpenVG | |
Extensions: EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_vg_parent_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_lock_surface | |
OpenGL Information: | |
Vendor: Broadcom | |
Renderer: VideoCore IV HW | |
Version: OpenGL ES 2.0 | |
Extensions: GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_texture_npot GL_OES_depth24 GL_OES_vertex_half_float GL_OES_EGL_image GL_OES_EGL_image_external GL_EXT_discard_framebuffer GL_OES_rgb8_rgba8 GL_OES_depth32 GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_APPLE_rgb_422 GL_EXT_debug_marker | |
Finished! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment