#define VL_INTERNAL #include "vl_surface.h" #include #include #include #include #include #include #include #include "vl_screen.h" #include "vl_context.h" #include "vl_render.h" #include "vl_csc.h" #include "vl_util.h" int vlCreateSurface ( struct vlScreen *screen, unsigned int width, unsigned int height, enum vlFormat format, struct vlSurface **surface ) { struct vlSurface *sfc; struct pipe_texture template; assert(screen); assert(surface); sfc = calloc(1, sizeof(struct vlSurface)); if (!sfc) return 1; sfc->screen = screen; sfc->width = width; sfc->height = height; sfc->format = format; memset(&template, 0, sizeof(struct pipe_texture)); template.target = PIPE_TEXTURE_2D; template.format = PIPE_FORMAT_A8R8G8B8_UNORM; template.last_level = 0; template.width[0] = vlRoundUpPOT(sfc->width); template.height[0] = vlRoundUpPOT(sfc->height); template.depth[0] = 1; template.compressed = 0; pf_get_block(template.format, &template.block); template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER | PIPE_TEXTURE_USAGE_RENDER_TARGET; sfc->texture = vlGetPipeScreen(screen)->texture_create(vlGetPipeScreen(screen), &template); *surface = sfc; return 0; } int vlDestroySurface ( struct vlSurface *surface ) { assert(surface); pipe_texture_release(&surface->texture); free(surface); return 0; } int vlRenderMacroBlocksMpeg2 ( struct vlMpeg2MacroBlockBatch *batch, struct vlSurface *surface ) { assert(batch); assert(surface); surface->context->render->vlBegin(surface->context->render); surface->context->render->vlRenderMacroBlocksMpeg2 ( surface->context->render, batch, surface ); surface->context->render->vlEnd(surface->context->render); return 0; } int vlPutPicture ( struct vlSurface *surface, vlNativeDrawable drawable, int srcx, int srcy, int srcw, int srch, int destx, int desty, int destw, int desth, enum vlPictureType picture_type ) { struct vlCSC *csc; struct pipe_context *pipe; assert(surface); assert(surface->context); surface->context->render->vlFlush(surface->context->render); csc = surface->context->csc; pipe = surface->context->pipe; csc->vlResizeFrameBuffer(csc, destw, desth); csc->vlBegin(csc); csc->vlPutPicture ( csc, surface, srcx, srcy, srcw, srch, destx, desty, destw, desth, picture_type ); csc->vlEnd(csc); pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL); bind_pipe_drawable(pipe, drawable); /* TODO: Need to take destx, desty into consideration */ pipe->winsys->flush_frontbuffer ( pipe->winsys, csc->vlGetFrameBuffer(csc), pipe->priv ); return 0; } struct vlScreen* vlSurfaceGetScreen ( struct vlSurface *surface ) { assert(surface); return surface->screen; } struct vlContext* vlBindToContext ( struct vlSurface *surface, struct vlContext *context ) { struct vlContext *old; assert(surface); old = surface->context; surface->context = context; return old; }