DEBUG_GET_ONCE_BOOL_OPTION(no_line_width, "SVGA_NO_LINE_WIDTH", FALSE);
DEBUG_GET_ONCE_BOOL_OPTION(force_hw_line_stipple, "SVGA_FORCE_HW_LINE_STIPPLE", FALSE);
-static void svga_destroy( struct pipe_context *pipe )
+
+static void
+svga_destroy(struct pipe_context *pipe)
{
- struct svga_context *svga = svga_context( pipe );
+ struct svga_context *svga = svga_context(pipe);
unsigned shader, i;
/* free any alternate rasterizer states used for point sprite */
}
}
+ /* free depthstencil_disable state */
+ if (svga->depthstencil_disable) {
+ pipe->delete_depth_stencil_alpha_state(pipe, svga->depthstencil_disable);
+ }
+
/* free HW constant buffers */
for (shader = 0; shader < ARRAY_SIZE(svga->state.hw_draw.constbuf); shader++) {
pipe_resource_reference(&svga->state.hw_draw.constbuf[shader], NULL);
util_blitter_destroy(svga->blitter);
svga_cleanup_sampler_state(svga);
- svga_cleanup_framebuffer( svga );
- svga_cleanup_tss_binding( svga );
+ svga_cleanup_framebuffer(svga);
+ svga_cleanup_tss_binding(svga);
svga_cleanup_vertex_state(svga);
-
- svga_destroy_swtnl( svga );
- svga_hwtnl_destroy( svga->hwtnl );
+
+ svga_destroy_swtnl(svga);
+ svga_hwtnl_destroy(svga->hwtnl);
svga->swc->destroy(svga->swc);
util_bitmask_destroy(svga->stream_output_id_bm);
util_bitmask_destroy(svga->query_id_bm);
u_upload_destroy(svga->const0_upload);
+ u_upload_destroy(svga->pipe.stream_uploader);
+ u_upload_destroy(svga->pipe.const_uploader);
svga_texture_transfer_map_upload_destroy(svga);
/* free user's constant buffers */
}
}
- FREE( svga );
+ FREE(svga);
}
-
-struct pipe_context *svga_context_create(struct pipe_screen *screen,
- void *priv, unsigned flags)
+struct pipe_context *
+svga_context_create(struct pipe_screen *screen, void *priv, unsigned flags)
{
struct svga_screen *svgascreen = svga_screen(screen);
struct svga_context *svga = NULL;
svga->pipe.screen = screen;
svga->pipe.priv = priv;
svga->pipe.destroy = svga_destroy;
+ svga->pipe.stream_uploader = u_upload_create(&svga->pipe, 1024 * 1024,
+ PIPE_BIND_VERTEX_BUFFER |
+ PIPE_BIND_INDEX_BUFFER,
+ PIPE_USAGE_STREAM);
+ if (!svga->pipe.stream_uploader)
+ goto cleanup;
+
+ svga->pipe.const_uploader = u_upload_create(&svga->pipe, 128 * 1024,
+ PIPE_BIND_CONSTANT_BUFFER,
+ PIPE_USAGE_STREAM);
+ if (!svga->pipe.const_uploader)
+ goto cleanup;
svga->swc = svgascreen->sws->context_create(svgascreen->sws);
if (!svga->swc)
if (!svga_init_swtnl(svga))
goto cleanup;
- ret = svga_emit_initial_state( svga );
+ ret = svga_emit_initial_state(svga);
if (ret != PIPE_OK)
goto cleanup;
/* Avoid shortcircuiting state with initial value of zero.
*/
memset(&svga->state.hw_clear, 0xcd, sizeof(svga->state.hw_clear));
- memset(&svga->state.hw_clear.framebuffer, 0x0,
+ memset(&svga->state.hw_clear.framebuffer, 0x0,
sizeof(svga->state.hw_clear.framebuffer));
memset(&svga->state.hw_draw, 0xcd, sizeof(svga->state.hw_draw));
svga->state.hw_draw.num_views = 0;
svga->state.hw_draw.num_rendertargets = 0;
svga->state.hw_draw.dsv = NULL;
+ svga->state.hw_draw.rasterizer_discard = FALSE;
/* Initialize the shader pointers */
svga->state.hw_draw.vs = NULL;
svga->dirty = ~0;
svga->pred.query_id = SVGA3D_INVALID_ID;
+ svga->disable_rasterizer = FALSE;
return &svga->pipe;
if (svga->const0_upload)
u_upload_destroy(svga->const0_upload);
+ if (svga->pipe.const_uploader)
+ u_upload_destroy(svga->pipe.const_uploader);
+ if (svga->pipe.stream_uploader)
+ u_upload_destroy(svga->pipe.stream_uploader);
svga_texture_transfer_map_upload_destroy(svga);
if (svga->hwtnl)
svga_hwtnl_destroy(svga->hwtnl);
}
-void svga_context_flush( struct svga_context *svga,
- struct pipe_fence_handle **pfence )
+void
+svga_context_flush(struct svga_context *svga,
+ struct pipe_fence_handle **pfence)
{
struct svga_screen *svgascreen = svga_screen(svga->pipe.screen);
struct pipe_fence_handle *fence = NULL;
if (SVGA_DEBUG & DEBUG_SYNC) {
if (fence)
- svga->pipe.screen->fence_finish( svga->pipe.screen, NULL, fence,
+ svga->pipe.screen->fence_finish(svga->pipe.screen, NULL, fence,
PIPE_TIMEOUT_INFINITE);
}
* If the command buffer overflows, we flush it and retry.
* \sa svga_hwtnl_flush()
*/
-void svga_hwtnl_flush_retry( struct svga_context *svga )
+void
+svga_hwtnl_flush_retry(struct svga_context *svga)
{
enum pipe_error ret = PIPE_OK;
- ret = svga_hwtnl_flush( svga->hwtnl );
+ ret = svga_hwtnl_flush(svga->hwtnl);
if (ret == PIPE_ERROR_OUT_OF_MEMORY) {
- svga_context_flush( svga, NULL );
- ret = svga_hwtnl_flush( svga->hwtnl );
+ svga_context_flush(svga, NULL);
+ ret = svga_hwtnl_flush(svga->hwtnl);
}
assert(ret == PIPE_OK);
*
* Otherwise DMA commands on the referred buffer will be emitted too late.
*/
-void svga_hwtnl_flush_buffer( struct svga_context *svga,
- struct pipe_resource *buffer )
+void
+svga_hwtnl_flush_buffer(struct svga_context *svga,
+ struct pipe_resource *buffer)
{
if (svga_hwtnl_is_buffer_referred(svga->hwtnl, buffer)) {
svga_hwtnl_flush_retry(svga);
}
-/* Emit all operations pending on host surfaces.
- */
-void svga_surfaces_flush(struct svga_context *svga)
+/**
+ * Emit all operations pending on host surfaces.
+ */
+void
+svga_surfaces_flush(struct svga_context *svga)
{
SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_SURFACEFLUSH);
/* Emit buffered drawing commands.
*/
- svga_hwtnl_flush_retry( svga );
+ svga_hwtnl_flush_retry(svga);
/* Emit back-copy from render target views to textures.
*/
struct svga_winsys_context *
-svga_winsys_context( struct pipe_context *pipe )
+svga_winsys_context(struct pipe_context *pipe)
{
- return svga_context( pipe )->swc;
+ return svga_context(pipe)->swc;
}