Rev 4523 | Rev 4526 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4523 | Rev 4525 | ||
---|---|---|---|
Line 87... | Line 87... | ||
87 | struct render* create_render(EGLDisplay dpy, EGLSurface surface, int dx, int dy) |
87 | struct render* create_render(EGLDisplay dpy, EGLSurface surface, int dx, int dy) |
88 | { |
88 | { |
89 | const char *vs_src = |
89 | const char *vs_src = |
90 | "attribute vec4 v_position;\n" |
90 | "attribute vec4 v_position;\n" |
91 | "attribute vec4 v_texcoord0;\n" |
91 | "attribute vec4 v_texcoord0;\n" |
92 | "attribute vec4 v_texcoord1;\n" |
- | |
93 | "varying vec2 source_texture;\n" |
92 | "varying vec2 source_texture;\n" |
94 | "varying vec2 mask_texture;\n" |
- | |
95 | "void main()\n" |
93 | "void main()\n" |
96 | "{\n" |
94 | "{\n" |
97 | " gl_Position = v_position;\n" |
95 | " gl_Position = v_position;\n" |
98 | " source_texture = v_texcoord0.xy;\n" |
96 | " source_texture = v_texcoord0.xy;\n" |
99 | " mask_texture = v_texcoord1.xy;\n" |
- | |
100 | "}\n"; |
97 | "}\n"; |
Line 101... | Line 98... | ||
101 | 98 | ||
102 | const char *fs_src = |
99 | const char *fs_src = |
103 | "varying vec2 source_texture;\n" |
- | |
104 | "varying vec2 mask_texture;\n" |
100 | "varying vec2 source_texture;\n" |
105 | "uniform sampler2D sampler_src;\n" |
101 | "uniform sampler2D sampler_src;\n" |
106 | "uniform sampler2D sampler_mask;\n" |
102 | "uniform sampler2D sampler_mask;\n" |
107 | "void main()\n" |
103 | "void main()\n" |
108 | "{\n" |
104 | "{\n" |
109 | " float ca = texture2D(sampler_mask, mask_texture).r;\n" |
105 | " float ca = texture2D(sampler_mask, source_texture).r;\n" |
110 | " gl_FragColor = vec4(texture2D(sampler_src, source_texture).rgb, ca);\n" |
106 | " gl_FragColor = vec4(texture2D(sampler_src, source_texture).rgb, ca);\n" |
Line 111... | Line 107... | ||
111 | "}\n"; |
107 | "}\n"; |
112 | 108 | ||
Line 222... | Line 218... | ||
222 | if(glGetError() != GL_NO_ERROR) |
218 | if(glGetError() != GL_NO_ERROR) |
223 | goto err6; |
219 | goto err6; |
Line 224... | Line 220... | ||
224 | 220 | ||
Line 225... | Line 221... | ||
225 | glBindTexture(GL_TEXTURE_2D, 0); |
221 | glBindTexture(GL_TEXTURE_2D, 0); |
226 | - | ||
Line 227... | Line 222... | ||
227 | render->back_buffer = EGL_DRM_BUFFER_BACK; |
222 | |
228 | 223 | render->back_buffer = EGL_DRM_BUFFER_FRONT; |
|
229 | 224 | ||
230 | render->screen = px_create_image(dpy,context,fb.width,fb.height, |
225 | render->screen = px_create_image(dpy,context,fb.width,fb.height, |
Line 313... | Line 308... | ||
313 | 308 | ||
314 | glAttachShader(render->blit_prog, vs_shader); |
309 | glAttachShader(render->blit_prog, vs_shader); |
315 | glAttachShader(render->blit_prog, fs_shader); |
310 | glAttachShader(render->blit_prog, fs_shader); |
316 | glBindAttribLocation(render->blit_prog, 0, "v_position"); |
311 | glBindAttribLocation(render->blit_prog, 0, "v_position"); |
317 | glBindAttribLocation(render->blit_prog, 1, "v_texcoord0"); |
- | |
Line 318... | Line 312... | ||
318 | glBindAttribLocation(render->blit_prog, 2, "v_texcoord1"); |
312 | glBindAttribLocation(render->blit_prog, 1, "v_texcoord0"); |
319 | 313 | ||
320 | glLinkProgram(render->blit_prog); |
314 | glLinkProgram(render->blit_prog); |
321 | glGetProgramiv(render->blit_prog, GL_LINK_STATUS, &ret); |
315 | glGetProgramiv(render->blit_prog, GL_LINK_STATUS, &ret); |
Line 344... | Line 338... | ||
344 | glEnableVertexAttribArray(0); |
338 | glEnableVertexAttribArray(0); |
Line 345... | Line 339... | ||
345 | 339 | ||
346 | glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float),render->tc_src); |
340 | glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float),render->tc_src); |
Line 347... | Line -... | ||
347 | glEnableVertexAttribArray(1); |
- | |
348 | - | ||
349 | glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float),render->tc_mask); |
- | |
350 | glEnableVertexAttribArray(2); |
341 | glEnableVertexAttribArray(1); |
351 | 342 | ||
Line 352... | Line 343... | ||
352 | glEnable(GL_BLEND); |
343 | glEnable(GL_BLEND); |
353 | glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
344 | glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
Line 394... | Line 385... | ||
394 | 385 | ||
395 | 386 | ||
396 | 387 | ||
397 | void create_mask(struct render *render) |
- | |
398 | { |
388 | void create_mask(struct render *render) |
399 | static EGLint attrib[] = |
- | |
400 | { |
389 | { |
401 | EGL_GL_TEXTURE_LEVEL_KHR, 0, |
390 | struct drm_i915_gem_create create; |
402 | EGL_NONE |
391 | struct drm_gem_flink flink; |
403 | }; |
392 | |
404 | struct drm_i915_gem_mmap_gtt mmap_arg; |
393 | struct drm_i915_gem_mmap mmap_arg; |
- | 394 | EGLint handle, stride; |
|
- | 395 | int winw, winh, pitch; |
|
- | 396 | void *data; |
|
- | 397 | int ret; |
|
Line 405... | Line 398... | ||
405 | EGLint handle, stride; |
398 | GLuint mask_handle, mask_name; |
406 | int winw, winh, pitch; |
399 | EGLImageKHR mask_image; |
407 | void *data; |
400 | |
Line 408... | Line 401... | ||
408 | 401 | ||
409 | glGenTextures(1, &render->tx_mask); |
402 | glGenTextures(1, &render->tx_mask); |
410 | if(glGetError() != GL_NO_ERROR) |
403 | if(glGetError() != GL_NO_ERROR) |
Line 411... | Line -... | ||
411 | goto err1; |
- | |
412 | - | ||
Line 413... | Line 404... | ||
413 | glBindTexture(GL_TEXTURE_2D, render->tx_mask); |
404 | return; |
- | 405 | ||
414 | if(glGetError() != GL_NO_ERROR) |
406 | glBindTexture(GL_TEXTURE_2D, render->tx_mask); |
- | 407 | if(glGetError() != GL_NO_ERROR) |
|
- | 408 | goto err1; |
|
- | 409 | ||
- | 410 | ||
- | 411 | pitch = (render->width+15) & ~15; |
|
- | 412 | ||
- | 413 | create.size = pitch *render->height; |
|
- | 414 | create.handle = 0; |
|
- | 415 | ret = drm_ioctl(render->fd, DRM_IOCTL_I915_GEM_CREATE, &create); |
|
Line -... | Line 416... | ||
- | 416 | if(ret != 0) |
|
415 | goto err2; |
417 | goto err1; |
Line 416... | Line 418... | ||
416 | 418 | ||
Line -... | Line 419... | ||
- | 419 | flink.handle = create.handle; |
|
- | 420 | ret = drm_ioctl(render->fd, DRM_IOCTL_GEM_FLINK, &flink); |
|
- | 421 | if (ret != 0) |
|
- | 422 | goto err2; |
|
- | 423 | ||
- | 424 | mask_handle = create.handle; |
|
- | 425 | mask_name = flink.name; |
|
- | 426 | ||
- | 427 | printf("create mask bo handle %d name %d\n", create.handle, flink.name); |
|
- | 428 | ||
- | 429 | EGLint attribs[] = { |
|
417 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); |
430 | EGL_WIDTH, 0, |
- | 431 | EGL_HEIGHT, 0, |
|
Line 418... | Line 432... | ||
418 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); |
432 | EGL_DRM_BUFFER_STRIDE_MESA, 0, |
419 | 433 | EGL_DRM_BUFFER_FORMAT_MESA, |
|
Line 420... | Line 434... | ||
420 | winw = render->width+10; |
434 | EGL_DRM_BUFFER_FORMAT_R8_MESA, |
Line 421... | Line -... | ||
421 | winh = render->height+20+5; |
- | |
422 | - | ||
Line 423... | Line 435... | ||
423 | pitch = (winw+3) & -4; |
435 | EGL_DRM_BUFFER_USE_MESA, |
424 | 436 | EGL_DRM_BUFFER_USE_SHARE_MESA, |
|
Line 425... | Line 437... | ||
425 | data = user_alloc(pitch * winh); |
437 | EGL_NONE |
426 | - | ||
Line 427... | Line 438... | ||
427 | memset(data, 0x20, pitch * winh); |
438 | }; |
428 | 439 | attribs[1] = pitch; |
|
Line 429... | Line 440... | ||
429 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, winw, winh, 0, |
440 | attribs[3] = render->height; |
Line 430... | Line 441... | ||
430 | GL_RED,GL_UNSIGNED_BYTE, data); |
441 | attribs[5] = pitch; |
431 | 442 | ||
432 | user_free(data); |
443 | mask_image = eglCreateImageKHR(render->dpy, render->context, EGL_DRM_BUFFER_MESA, |
433 | 444 | (void *) (uintptr_t)mask_name, attribs); |
|
434 | if(glGetError() != GL_NO_ERROR) |
445 | |
435 | goto err2; |
446 | printf("create mask image %p\n", mask_image); |
436 | 447 | ||
437 | render->mask = eglCreateImageKHR(render->dpy, render->context, |
448 | |
438 | EGL_GL_TEXTURE_2D_KHR,(EGLClientBuffer)render->tx_mask,attrib); |
449 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); |
Line 439... | Line 450... | ||
439 | 450 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); |
|
440 | if(render->mask == EGL_NO_IMAGE_KHR) |
451 | |
441 | goto err2; |
- | |
442 | 452 | glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, mask_image); |
|
443 | if(!eglExportDRMImageMESA(render->dpy, render->mask, NULL, &handle, &stride)) |
453 | |
Line 444... | Line 454... | ||
444 | goto err3; |
454 | if(glGetError() != GL_NO_ERROR) |
Line 445... | Line 455... | ||
445 | 455 | goto err2; |
|
446 | glBindTexture(GL_TEXTURE_2D, 0); |
456 | |
447 | 457 | glBindTexture(GL_TEXTURE_2D, 0); |
|
448 | mmap_arg.handle = handle; |
458 | |
449 | mmap_arg.offset = 0; |
459 | mmap_arg.handle = mask_handle; |
450 | // mmap_arg.size = stride * winh; |
460 | mmap_arg.offset = 0; |
451 | if (drm_ioctl(render->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &mmap_arg)) |
461 | mmap_arg.size = pitch * render->height; |