Rev 4502 | Rev 4523 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4502 | Rev 4517 | ||
---|---|---|---|
Line 5... | Line 5... | ||
5 | 5 | ||
6 | #include "render.h" |
6 | #include "render.h" |
7 | #include |
7 | #include |
Line -... | Line 8... | ||
- | 8 | #include |
|
Line 8... | Line 9... | ||
8 | #include |
9 | |
9 | 10 | void create_mask(struct render *render); |
|
10 | 11 | ||
Line 240... | Line 241... | ||
240 | if(glGetError() != GL_NO_ERROR) |
241 | if(glGetError() != GL_NO_ERROR) |
241 | goto err7; |
242 | goto err7; |
Line 242... | Line 243... | ||
242 | 243 | ||
Line -... | Line 244... | ||
- | 244 | glBindTexture(GL_TEXTURE_2D, 0); |
|
- | 245 | ||
243 | glBindTexture(GL_TEXTURE_2D, 0); |
246 | create_mask(render); |
244 | 247 | ||
245 | glGenFramebuffers(1, &render->framebuffer); |
248 | glGenFramebuffers(1, &render->framebuffer); |
Line 246... | Line 249... | ||
246 | if(glGetError() != GL_NO_ERROR) |
249 | if(glGetError() != GL_NO_ERROR) |
Line 324... | Line 327... | ||
324 | free(info); |
327 | free(info); |
325 | } |
328 | } |
Line 326... | Line 329... | ||
326 | 329 | ||
Line -... | Line 330... | ||
- | 330 | render->sampler = glGetUniformLocation(render->blit_prog,"sampler"); |
|
- | 331 | ||
- | 332 | glUseProgram(render->blit_prog); |
|
- | 333 | glUniform1i(render->sampler, 0); |
|
- | 334 | ||
- | 335 | glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 2 * sizeof(float),render->vertices); |
|
- | 336 | glEnableVertexAttribArray(0); |
|
- | 337 | ||
- | 338 | glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float),render->texcoords); |
|
327 | render->sampler = glGetUniformLocation(render->blit_prog,"sampler"); |
339 | glEnableVertexAttribArray(1); |
Line 328... | Line 340... | ||
328 | 340 | ||
Line 329... | Line 341... | ||
329 | eglMakeCurrent(dpy, surface, surface, context); |
341 | eglMakeCurrent(dpy, surface, surface, context); |
Line 356... | Line 368... | ||
356 | return NULL; |
368 | return NULL; |
357 | }; |
369 | }; |
Line -... | Line 370... | ||
- | 370 | ||
- | 371 | ||
- | 372 | ||
- | 373 | ||
- | 374 | void create_mask(struct render *render) |
|
- | 375 | { |
|
- | 376 | static EGLint attrib[] = |
|
- | 377 | { |
|
- | 378 | EGL_GL_TEXTURE_LEVEL_KHR, 0, |
|
- | 379 | EGL_NONE |
|
- | 380 | }; |
|
- | 381 | struct drm_i915_gem_mmap mmap_arg; |
|
- | 382 | EGLint handle, stride; |
|
- | 383 | int pitch; |
|
- | 384 | void *data; |
|
- | 385 | ||
- | 386 | glGenTextures(1, &render->tx_mask); |
|
- | 387 | if(glGetError() != GL_NO_ERROR) |
|
- | 388 | goto err1; |
|
- | 389 | ||
- | 390 | glBindTexture(GL_TEXTURE_2D, render->tx_mask); |
|
- | 391 | if(glGetError() != GL_NO_ERROR) |
|
- | 392 | goto err2; |
|
- | 393 | ||
- | 394 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); |
|
- | 395 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); |
|
- | 396 | ||
- | 397 | pitch = (render->width+3) & -4; |
|
- | 398 | ||
- | 399 | data = user_alloc(pitch*render->height); |
|
- | 400 | ||
- | 401 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, render->width, render->height, 0, |
|
- | 402 | GL_RED,GL_UNSIGNED_BYTE, data); |
|
- | 403 | ||
- | 404 | user_free(data); |
|
- | 405 | ||
- | 406 | if(glGetError() != GL_NO_ERROR) |
|
- | 407 | goto err2; |
|
- | 408 | ||
- | 409 | render->mask = eglCreateImageKHR(render->dpy, render->context, |
|
- | 410 | EGL_GL_TEXTURE_2D_KHR,(EGLClientBuffer)render->tx_mask,attrib); |
|
- | 411 | ||
- | 412 | if(render->mask == EGL_NO_IMAGE_KHR) |
|
- | 413 | goto err2; |
|
- | 414 | ||
- | 415 | if(!eglExportDRMImageMESA(render->dpy, render->mask, NULL, &handle, &stride)) |
|
- | 416 | goto err3; |
|
- | 417 | ||
- | 418 | glBindTexture(GL_TEXTURE_2D, 0); |
|
- | 419 | ||
- | 420 | mmap_arg.handle = handle; |
|
- | 421 | mmap_arg.offset = 0; |
|
- | 422 | mmap_arg.size = stride * render->height; |
|
- | 423 | if (drm_ioctl(render->fd, DRM_IOCTL_I915_GEM_MMAP, &mmap_arg)) |
|
- | 424 | { |
|
- | 425 | printf("%s: failed to mmap image %p handle=%d, %d bytes, into CPU domain\n", |
|
- | 426 | __FUNCTION__, render->mask, handle, stride*render->height); |
|
- | 427 | goto err3; |
|
- | 428 | } |
|
- | 429 | ||
- | 430 | render->mask_buffer = (void *)(uintptr_t)mmap_arg.addr_ptr; |
|
- | 431 | ||
- | 432 | printf("%s: mmap image %p handle=%d, %d bytes to %p\n", |
|
- | 433 | __FUNCTION__, render->mask, handle, stride*render->height, render->mask_buffer); |
|
- | 434 | ||
- | 435 | return; |
|
- | 436 | ||
- | 437 | err3: |
|
- | 438 | eglDestroyImageKHR(render->dpy, render->mask); |
|
- | 439 | err2: |
|
- | 440 | glBindTexture(GL_TEXTURE_2D, 0); |