void device_stage_texture(device_t device, stagesurf_t dst, texture_t src) { struct gs_texture_2d *tex2d = (struct gs_texture_2d*)src; if (!can_stage(dst, tex2d)) goto failed; if (!gl_copy_texture(device, dst->texture, GL_TEXTURE_2D, tex2d->base.texture, GL_TEXTURE_2D, dst->width, dst->height)) goto failed; if (!gl_bind_texture(GL_TEXTURE_2D, dst->texture)) goto failed; if (!gl_bind_buffer(GL_PIXEL_PACK_BUFFER, dst->pack_buffer)) goto failed; glGetTexImage(GL_TEXTURE_2D, 0, dst->gl_format, dst->gl_type, 0); if (!gl_success("glGetTexImage")) goto failed; gl_bind_buffer(GL_PIXEL_PACK_BUFFER, 0); gl_bind_texture(GL_TEXTURE_2D, 0); return; failed: gl_bind_buffer(GL_PIXEL_PACK_BUFFER, 0); gl_bind_texture(GL_TEXTURE_2D, 0); blog(LOG_ERROR, "device_stage_texture (GL) failed"); }
void device_copy_texture_region(gs_device_t *device, gs_texture_t *dst, uint32_t dst_x, uint32_t dst_y, gs_texture_t *src, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h) { struct gs_texture_2d *src2d = (struct gs_texture_2d*)src; struct gs_texture_2d *dst2d = (struct gs_texture_2d*)dst; if (!src) { blog(LOG_ERROR, "Source texture is NULL"); goto fail; } if (!dst) { blog(LOG_ERROR, "Destination texture is NULL"); goto fail; } if (dst->type != GS_TEXTURE_2D || src->type != GS_TEXTURE_2D) { blog(LOG_ERROR, "Source and destination textures must be 2D " "textures"); goto fail; } if (dst->format != src->format) { blog(LOG_ERROR, "Source and destination formats do not match"); goto fail; } uint32_t nw = (uint32_t)src_w ? (uint32_t)src_w : (src2d->width - src_x); uint32_t nh = (uint32_t)src_h ? (uint32_t)src_h : (src2d->height - src_y); if (dst2d->width - dst_x < nw || dst2d->height - dst_y < nh) { blog(LOG_ERROR, "Destination texture region is not big " "enough to hold the source region"); goto fail; } if (!gl_copy_texture(device, dst->texture, dst->gl_target, dst_x, dst_y, src->texture, src->gl_target, src_x, src_y, nw, nh, src->format)) goto fail; return; fail: blog(LOG_ERROR, "device_copy_texture (GL) failed"); }
void device_copy_texture(device_t device, texture_t dst, texture_t src) { struct gs_texture_2d *src2d = (struct gs_texture_2d*)src; struct gs_texture_2d *dst2d = (struct gs_texture_2d*)dst; if (!src) { blog(LOG_ERROR, "Source texture is NULL"); goto fail; } if (!dst) { blog(LOG_ERROR, "Destination texture is NULL"); goto fail; } if (dst->type != GS_TEXTURE_2D || src->type != GS_TEXTURE_2D) { blog(LOG_ERROR, "Source and destination textures must be 2D " "textures"); goto fail; } if (dst->format != src->format) { blog(LOG_ERROR, "Source and destination formats do not match"); goto fail; } if (dst2d->width != src2d->width || dst2d->height != src2d->height) { blog(LOG_ERROR, "Source and destination must have " "the same dimensions"); goto fail; } if (!gl_copy_texture(device, dst->texture, dst->gl_target, src->texture, src->gl_target, src2d->width, src2d->height)) goto fail; return; fail: blog(LOG_ERROR, "device_copy_texture (GL) failed"); }