2 #include "vl_surface.h"
6 #include <pipe/p_screen.h>
7 #include <pipe/p_state.h>
8 #include <pipe/p_inlines.h>
10 #include "vl_screen.h"
11 #include "vl_context.h"
12 #include "vl_render.h"
18 struct vlScreen
*screen
,
22 struct vlSurface
**surface
25 struct vlSurface
*sfc
;
26 struct pipe_texture
template;
31 sfc
= calloc(1, sizeof(struct vlSurface
));
41 memset(&template, 0, sizeof(struct pipe_texture
));
42 template.target
= PIPE_TEXTURE_2D
;
43 template.format
= PIPE_FORMAT_A8R8G8B8_UNORM
;
44 template.last_level
= 0;
45 template.width
[0] = vlRoundUpPOT(sfc
->width
);
46 template.height
[0] = vlRoundUpPOT(sfc
->height
);
47 template.depth
[0] = 1;
48 template.compressed
= 0;
49 pf_get_block(template.format
, &template.block
);
50 template.tex_usage
= PIPE_TEXTURE_USAGE_SAMPLER
| PIPE_TEXTURE_USAGE_RENDER_TARGET
;
52 sfc
->texture
= vlGetPipeScreen(screen
)->texture_create(vlGetPipeScreen(screen
), &template);
61 struct vlSurface
*surface
66 pipe_texture_release(&surface
->texture
);
72 int vlRenderMacroBlocksMpeg2
74 struct vlMpeg2MacroBlockBatch
*batch
,
75 struct vlSurface
*surface
80 assert(surface
->context
);
82 surface
->context
->render
->vlBegin(surface
->context
->render
);
84 surface
->context
->render
->vlRenderMacroBlocksMpeg2
86 surface
->context
->render
,
91 surface
->context
->render
->vlEnd(surface
->context
->render
);
98 struct vlSurface
*surface
,
99 vlNativeDrawable drawable
,
110 enum vlPictureType picture_type
114 struct pipe_context
*pipe
;
117 assert(surface
->context
);
119 surface
->context
->render
->vlFlush(surface
->context
->render
);
121 csc
= surface
->context
->csc
;
122 pipe
= surface
->context
->pipe
;
124 csc
->vlResizeFrameBuffer(csc
, drawable_w
, drawable_h
);
145 pipe
->flush(pipe
, PIPE_FLUSH_RENDER_CACHE
, &surface
->disp_fence
);
147 bind_pipe_drawable(pipe
, drawable
);
149 pipe
->winsys
->flush_frontbuffer
152 csc
->vlGetFrameBuffer(csc
),
159 int vlSurfaceGetStatus
161 struct vlSurface
*surface
,
162 enum vlResourceStatus
*status
166 assert(surface
->context
);
169 if (surface
->render_fence
&& !surface
->context
->pipe
->winsys
->fence_signalled(surface
->context
->pipe
->winsys
, surface
->render_fence
, 0))
171 *status
= vlResourceStatusRendering
;
175 if (surface
->disp_fence
&& !surface
->context
->pipe
->winsys
->fence_signalled(surface
->context
->pipe
->winsys
, surface
->disp_fence
, 0))
177 *status
= vlResourceStatusDisplaying
;
181 *status
= vlResourceStatusFree
;
187 struct vlSurface
*surface
191 assert(surface
->context
);
193 surface
->context
->render
->vlFlush(surface
->context
->render
);
200 struct vlSurface
*surface
204 assert(surface
->context
);
205 assert(surface
->render_fence
);
207 surface
->context
->pipe
->winsys
->fence_finish(surface
->context
->pipe
->winsys
, surface
->render_fence
, 0);
212 struct vlScreen
* vlSurfaceGetScreen
214 struct vlSurface
*surface
219 return surface
->screen
;
222 struct vlContext
* vlBindToContext
224 struct vlSurface
*surface
,
225 struct vlContext
*context
228 struct vlContext
*old
;
232 old
= surface
->context
;
233 surface
->context
= context
;