diff options
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/r600/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/evergreen_state.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_asm.h | 7 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_blit.c | 164 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_pipe.c | 5 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 47 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_public.h | 27 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_query.c | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 28 | ||||
| -rw-r--r-- | src/gallium/drivers/r600/r600_state.c | 146 | 
10 files changed, 225 insertions, 208 deletions
| diff --git a/src/gallium/drivers/r600/Makefile b/src/gallium/drivers/r600/Makefile index 213534198a..ede0bb2ec4 100644 --- a/src/gallium/drivers/r600/Makefile +++ b/src/gallium/drivers/r600/Makefile @@ -8,6 +8,7 @@ LIBRARY_INCLUDES = \  C_SOURCES = \  	r600_asm.c \ +	r600_blit.c \  	r600_buffer.c \  	r600_helper.c \  	r600_pipe.c \ diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index fc517f13ad..a30025642d 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -1360,7 +1360,7 @@ void evergreen_draw(struct pipe_context *ctx, const struct pipe_draw_info *info)  		draw.max_index = info->max_index;  		draw.index_bias = info->index_bias; -		r600_translate_index_buffer2(rctx, &rctx->index_buffer.buffer, +		r600_translate_index_buffer(rctx, &rctx->index_buffer.buffer,  					    &rctx->index_buffer.index_size,  					    &draw.start,  					    info->count); diff --git a/src/gallium/drivers/r600/r600_asm.h b/src/gallium/drivers/r600/r600_asm.h index 6aadf72957..cf67ca2d68 100644 --- a/src/gallium/drivers/r600/r600_asm.h +++ b/src/gallium/drivers/r600/r600_asm.h @@ -176,6 +176,10 @@ struct r600_bc {  	struct r600_cf_callstack	callstack[SQ_MAX_CALL_DEPTH];  }; +/* eg_asm.c */ +int eg_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf); + +/* r600_asm.c */  int r600_bc_init(struct r600_bc *bc, enum radeon_family family);  int r600_bc_add_alu(struct r600_bc *bc, const struct r600_bc_alu *alu);  int r600_bc_add_literal(struct r600_bc *bc, const u32 *value); @@ -186,4 +190,7 @@ int r600_bc_build(struct r600_bc *bc);  int r600_bc_add_cfinst(struct r600_bc *bc, int inst);  int r600_bc_add_alu_type(struct r600_bc *bc, const struct r600_bc_alu *alu, int type); +/* r700_asm.c */ +int r700_bc_alu_build(struct r600_bc *bc, struct r600_bc_alu *alu, unsigned id); +  #endif diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c new file mode 100644 index 0000000000..a19f494ea0 --- /dev/null +++ b/src/gallium/drivers/r600/r600_blit.c @@ -0,0 +1,164 @@ +/* + * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include <util/u_surface.h> +#include <util/u_blitter.h> +#include "r600_pipe.h" + +static void r600_blitter_save_states(struct pipe_context *ctx) +{ +	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; + +	util_blitter_save_blend(rctx->blitter, rctx->states[R600_PIPE_STATE_BLEND]); +	util_blitter_save_depth_stencil_alpha(rctx->blitter, rctx->states[R600_PIPE_STATE_DSA]); +	if (rctx->states[R600_PIPE_STATE_STENCIL_REF]) { +		util_blitter_save_stencil_ref(rctx->blitter, &rctx->stencil_ref); +	} +	util_blitter_save_rasterizer(rctx->blitter, rctx->states[R600_PIPE_STATE_RASTERIZER]); +	util_blitter_save_fragment_shader(rctx->blitter, rctx->ps_shader); +	util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader); +	util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_elements); +	if (rctx->states[R600_PIPE_STATE_VIEWPORT]) { +		util_blitter_save_viewport(rctx->blitter, &rctx->viewport); +	} +	if (rctx->states[R600_PIPE_STATE_CLIP]) { +		util_blitter_save_clip(rctx->blitter, &rctx->clip); +	} +	util_blitter_save_vertex_buffers(rctx->blitter, rctx->nvertex_buffer, rctx->vertex_buffer); + +	rctx->vertex_elements = NULL; + +	/* TODO queries */ +} + +int r600_blit_uncompress_depth2(struct pipe_context *ctx, struct r600_resource_texture *texture) +{ +	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; +	struct pipe_framebuffer_state fb = *rctx->pframebuffer; +	struct pipe_surface *zsurf, *cbsurf; +	int level = 0; +	float depth = 1.0f; + +	r600_context_queries_suspend(&rctx->ctx); +	for (int i = 0; i < fb.nr_cbufs; i++) { +		fb.cbufs[i] = NULL; +		pipe_surface_reference(&fb.cbufs[i], rctx->pframebuffer->cbufs[i]); +	} +	fb.zsbuf = NULL; +	pipe_surface_reference(&fb.zsbuf, rctx->pframebuffer->zsbuf); + +	zsurf = ctx->screen->get_tex_surface(ctx->screen, &texture->resource.base.b, 0, level, 0, +					     PIPE_BIND_DEPTH_STENCIL); + +	cbsurf = ctx->screen->get_tex_surface(ctx->screen, +			(struct pipe_resource*)texture->flushed_depth_texture, +			0, level, 0, PIPE_BIND_RENDER_TARGET); + +	r600_blitter_save_states(ctx); +	util_blitter_save_framebuffer(rctx->blitter, &fb); + +	if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || +		rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) +		depth = 0.0f; + +	util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, rctx->custom_dsa_flush, depth); + +	pipe_surface_reference(&zsurf, NULL); +	pipe_surface_reference(&cbsurf, NULL); +	for (int i = 0; i < fb.nr_cbufs; i++) { +		pipe_surface_reference(&fb.cbufs[i], NULL); +	} +	pipe_surface_reference(&fb.zsbuf, NULL); +	r600_context_queries_resume(&rctx->ctx); + +	return 0; +} + +static void r600_clear(struct pipe_context *ctx, unsigned buffers, +			const float *rgba, double depth, unsigned stencil) +{ +	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; +	struct pipe_framebuffer_state *fb = &rctx->framebuffer; + +	r600_context_queries_suspend(&rctx->ctx); +	r600_blitter_save_states(ctx); +	util_blitter_clear(rctx->blitter, fb->width, fb->height, +				fb->nr_cbufs, buffers, rgba, depth, +				stencil); +	r600_context_queries_resume(&rctx->ctx); +} + +static void r600_clear_render_target(struct pipe_context *ctx, +				     struct pipe_surface *dst, +				     const float *rgba, +				     unsigned dstx, unsigned dsty, +				     unsigned width, unsigned height) +{ +	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; +	struct pipe_framebuffer_state *fb = &rctx->framebuffer; + +	r600_context_queries_suspend(&rctx->ctx); +	util_blitter_save_framebuffer(rctx->blitter, fb); +	util_blitter_clear_render_target(rctx->blitter, dst, rgba, +					 dstx, dsty, width, height); +	r600_context_queries_resume(&rctx->ctx); +} + +static void r600_clear_depth_stencil(struct pipe_context *ctx, +				     struct pipe_surface *dst, +				     unsigned clear_flags, +				     double depth, +				     unsigned stencil, +				     unsigned dstx, unsigned dsty, +				     unsigned width, unsigned height) +{ +	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; +	struct pipe_framebuffer_state *fb = &rctx->framebuffer; + +	r600_context_queries_suspend(&rctx->ctx); +	util_blitter_save_framebuffer(rctx->blitter, fb); +	util_blitter_clear_depth_stencil(rctx->blitter, dst, clear_flags, depth, stencil, +					 dstx, dsty, width, height); +	r600_context_queries_resume(&rctx->ctx); +} + + +static void r600_resource_copy_region(struct pipe_context *ctx, +				      struct pipe_resource *dst, +				      struct pipe_subresource subdst, +				      unsigned dstx, unsigned dsty, unsigned dstz, +				      struct pipe_resource *src, +				      struct pipe_subresource subsrc, +				      unsigned srcx, unsigned srcy, unsigned srcz, +				      unsigned width, unsigned height) +{ +	util_resource_copy_region(ctx, dst, subdst, dstx, dsty, dstz, +				  src, subsrc, srcx, srcy, srcz, width, height); +} + +void r600_init_blit_functions2(struct r600_pipe_context *rctx) +{ +	rctx->context.clear = r600_clear; +	rctx->context.clear_render_target = r600_clear_render_target; +	rctx->context.clear_depth_stencil = r600_clear_depth_stencil; +	rctx->context.resource_copy_region = r600_resource_copy_region; +} diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 0613cd1eca..3c4424039b 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -147,7 +147,7 @@ static struct pipe_context *r600_create_context2(struct pipe_screen *screen, voi  	rctx->family = r600_get_family(rctx->radeon);  	r600_init_blit_functions2(rctx); -	r600_init_query_functions2(rctx); +	r600_init_query_functions(rctx);  	r600_init_context_resource_functions2(rctx);  	switch (r600_get_family(rctx->radeon)) { @@ -210,7 +210,6 @@ static struct pipe_context *r600_create_context2(struct pipe_screen *screen, voi  		return NULL;  	} -	LIST_INITHEAD(&rctx->query_list);  	rctx->custom_dsa_flush = r600_create_db_flush_dsa(rctx);  	r600_blit_uncompress_depth_ptr = r600_blit_uncompress_depth2; @@ -423,7 +422,7 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)  } -struct pipe_screen *r600_screen_create2(struct radeon *radeon) +struct pipe_screen *r600_screen_create(struct radeon *radeon)  {  	struct r600_screen *rscreen; diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index ab31180df7..98ed8b7c69 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -31,6 +31,7 @@  #include <pipe/p_context.h>  #include <util/u_math.h>  #include "r600.h" +#include "r600_public.h"  #include "r600_shader.h"  #include "r600_resource.h" @@ -91,14 +92,12 @@ struct r600_pipe_shader {  	struct r600_vertex_element	vertex_elements;  }; -  struct r600_pipe_context {  	struct pipe_context		context;  	struct blitter_context		*blitter;  	struct pipe_framebuffer_state	*pframebuffer;  	unsigned			family;  	void				*custom_dsa_flush; -	struct list_head		query_list; /* fake member for depth remove once merged */  	struct r600_screen		*screen;  	struct radeon			*radeon;  	struct r600_pipe_state		*states[R600_PIPE_NSTATES]; @@ -146,20 +145,6 @@ struct r600_drawl {  	struct pipe_resource	*index_buffer;  }; -uint32_t r600_translate_texformat(enum pipe_format format, -				  const unsigned char *swizzle_view,  -				  uint32_t *word4_p, uint32_t *yuv_format_p); - -/* r600_state2.c */ -int r600_pipe_shader_update2(struct pipe_context *ctx, struct r600_pipe_shader *shader); -int r600_pipe_shader_create2(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens); -void r600_translate_index_buffer2(struct r600_pipe_context *r600, -					struct pipe_resource **index_buffer, -					unsigned *index_size, -					unsigned *start, unsigned count); -int r600_find_vs_semantic_index2(struct r600_shader *vs, -				struct r600_shader *ps, int id); -  /* evergreen_state.c */  void evergreen_init_state_functions2(struct r600_pipe_context *rctx);  void evergreen_init_config2(struct r600_pipe_context *rctx); @@ -167,12 +152,6 @@ void evergreen_draw(struct pipe_context *ctx, const struct pipe_draw_info *info)  void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader);  void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shader); -static INLINE u32 S_FIXED(float value, u32 frac_bits) -{ -	return value * (1 << frac_bits); -} -#define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y)) -  /* r600_blit.c */  void r600_init_blit_functions2(struct r600_pipe_context *rctx);  int r600_blit_uncompress_depth2(struct pipe_context *ctx, struct r600_resource_texture *texture); @@ -192,20 +171,42 @@ int r600_upload_index_buffer(struct r600_pipe_context *rctx, struct r600_drawl *  int r600_upload_user_buffers(struct r600_pipe_context *rctx);  /* r600_query.c */ -void r600_init_query_functions2(struct r600_pipe_context *rctx); +void r600_init_query_functions(struct r600_pipe_context *rctx);  /* r600_resource.c */  void r600_init_context_resource_functions2(struct r600_pipe_context *r600); +/* r600_shader.c */ +int r600_pipe_shader_update2(struct pipe_context *ctx, struct r600_pipe_shader *shader); +int r600_pipe_shader_create2(struct pipe_context *ctx, struct r600_pipe_shader *shader, const struct tgsi_token *tokens); +int r600_find_vs_semantic_index2(struct r600_shader *vs, +				struct r600_shader *ps, int id); +  /* r600_state.c */  void r600_init_state_functions2(struct r600_pipe_context *rctx);  void r600_draw_vbo2(struct pipe_context *ctx, const struct pipe_draw_info *info);  void r600_init_config2(struct r600_pipe_context *rctx); +void r600_translate_index_buffer(struct r600_pipe_context *r600, +					struct pipe_resource **index_buffer, +					unsigned *index_size, +					unsigned *start, unsigned count);  /* r600_helper.h */  int r600_conv_pipe_prim(unsigned pprim, unsigned *prim);  /* r600_texture.c */  void r600_init_screen_texture_functions(struct pipe_screen *screen); +uint32_t r600_translate_texformat(enum pipe_format format, +				  const unsigned char *swizzle_view,  +				  uint32_t *word4_p, uint32_t *yuv_format_p); + +/* + * common helpers + */ +static INLINE u32 S_FIXED(float value, u32 frac_bits) +{ +	return value * (1 << frac_bits); +} +#define ALIGN_DIVUP(x, y) (((x) + (y) - 1) / (y))  #endif diff --git a/src/gallium/drivers/r600/r600_public.h b/src/gallium/drivers/r600/r600_public.h index 1d89c9f9f6..f1970201e8 100644 --- a/src/gallium/drivers/r600/r600_public.h +++ b/src/gallium/drivers/r600/r600_public.h @@ -1,9 +1,28 @@ - +/* + * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */  #ifndef R600_PUBLIC_H  #define R600_PUBLIC_H -struct radeon; - -struct pipe_screen* r600_screen_create(struct radeon *rw); +struct pipe_screen *r600_screen_create(struct radeon *radeon);  #endif diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c index 7385a6f1e1..726668260c 100644 --- a/src/gallium/drivers/r600/r600_query.c +++ b/src/gallium/drivers/r600/r600_query.c @@ -20,10 +20,6 @@   * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE   * USE OR OTHER DEALINGS IN THE SOFTWARE.   */ - -/* TODO: - *	- fix mask for depth control & cull for query - */  #include "r600_pipe.h"  static struct pipe_query *r600_create_query(struct pipe_context *ctx, unsigned query_type) @@ -70,7 +66,7 @@ static boolean r600_get_query_result(struct pipe_context *ctx,  	return r600_context_query_result(&rctx->ctx, (struct r600_query *)query, wait, vresult);  } -void r600_init_query_functions2(struct r600_pipe_context *rctx) +void r600_init_query_functions(struct r600_pipe_context *rctx)  {  	rctx->context.create_query = r600_create_query;  	rctx->context.destroy_query = r600_destroy_query; diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 718754b104..a0cd830d26 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -1349,34 +1349,6 @@ static int tgsi_rsq(struct r600_shader_ctx *ctx)  	return tgsi_helper_tempx_replicate(ctx);  } -static int tgsi_trans(struct r600_shader_ctx *ctx) -{ -	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; -	struct r600_bc_alu alu; -	int i, j, r; - -	for (i = 0; i < 4; i++) { -		memset(&alu, 0, sizeof(struct r600_bc_alu)); -		if (inst->Dst[0].Register.WriteMask & (1 << i)) { -			alu.inst = ctx->inst_info->r600_opcode; -			for (j = 0; j < inst->Instruction.NumSrcRegs; j++) { -				r = tgsi_src(ctx, &inst->Src[j], &alu.src[j]); -				if (r) -					return r; -				alu.src[j].chan = tgsi_chan(&inst->Src[j], i); -			} -			r = tgsi_dst(ctx, &inst->Dst[0], i, &alu.dst); -			if (r) -				return r; -			alu.last = 1; -			r = r600_bc_add_alu(ctx->bc, &alu); -			if (r) -				return r; -		} -	} -	return 0; -} -  static int tgsi_helper_tempx_replicate(struct r600_shader_ctx *ctx)  {  	struct tgsi_full_instruction *inst = &ctx->parse.FullToken.FullInstruction; diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 911d4835b4..f5ec5cde37 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -32,10 +32,7 @@  #include <tgsi/tgsi_scan.h>  #include <tgsi/tgsi_parse.h>  #include <tgsi/tgsi_util.h> -#include <util/u_blitter.h>  #include <util/u_double_list.h> -#include <util/u_transfer.h> -#include <util/u_surface.h>  #include <util/u_pack_color.h>  #include <util/u_memory.h>  #include <util/u_inlines.h> @@ -184,7 +181,7 @@ static void r600_draw_common(struct r600_drawl *draw)  	r600_context_draw(&rctx->ctx, &rdraw);  } -void r600_translate_index_buffer2(struct r600_pipe_context *r600, +void r600_translate_index_buffer(struct r600_pipe_context *r600,  					struct pipe_resource **index_buffer,  					unsigned *index_size,  					unsigned *start, unsigned count) @@ -229,7 +226,7 @@ void r600_draw_vbo2(struct pipe_context *ctx, const struct pipe_draw_info *info)  		draw.max_index = info->max_index;  		draw.index_bias = info->index_bias; -		r600_translate_index_buffer2(rctx, &rctx->index_buffer.buffer, +		r600_translate_index_buffer(rctx, &rctx->index_buffer.buffer,  					    &rctx->index_buffer.index_size,  					    &draw.start,  					    info->count); @@ -251,145 +248,6 @@ void r600_draw_vbo2(struct pipe_context *ctx, const struct pipe_draw_info *info)  	pipe_resource_reference(&draw.index_buffer, NULL);  } - -static void r600_blitter_save_states(struct pipe_context *ctx) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; - -	util_blitter_save_blend(rctx->blitter, rctx->states[R600_PIPE_STATE_BLEND]); -	util_blitter_save_depth_stencil_alpha(rctx->blitter, rctx->states[R600_PIPE_STATE_DSA]); -	if (rctx->states[R600_PIPE_STATE_STENCIL_REF]) { -		util_blitter_save_stencil_ref(rctx->blitter, &rctx->stencil_ref); -	} -	util_blitter_save_rasterizer(rctx->blitter, rctx->states[R600_PIPE_STATE_RASTERIZER]); -	util_blitter_save_fragment_shader(rctx->blitter, rctx->ps_shader); -	util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader); -	util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_elements); -	if (rctx->states[R600_PIPE_STATE_VIEWPORT]) { -		util_blitter_save_viewport(rctx->blitter, &rctx->viewport); -	} -	if (rctx->states[R600_PIPE_STATE_CLIP]) { -		util_blitter_save_clip(rctx->blitter, &rctx->clip); -	} -	util_blitter_save_vertex_buffers(rctx->blitter, rctx->nvertex_buffer, rctx->vertex_buffer); - -	rctx->vertex_elements = NULL; - -	/* TODO queries */ -} - -int r600_blit_uncompress_depth2(struct pipe_context *ctx, struct r600_resource_texture *texture) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; -	struct pipe_framebuffer_state fb = *rctx->pframebuffer; -	struct pipe_surface *zsurf, *cbsurf; -	int level = 0; -	float depth = 1.0f; - -	r600_context_queries_suspend(&rctx->ctx); -	for (int i = 0; i < fb.nr_cbufs; i++) { -		fb.cbufs[i] = NULL; -		pipe_surface_reference(&fb.cbufs[i], rctx->pframebuffer->cbufs[i]); -	} -	fb.zsbuf = NULL; -	pipe_surface_reference(&fb.zsbuf, rctx->pframebuffer->zsbuf); - -	zsurf = ctx->screen->get_tex_surface(ctx->screen, &texture->resource.base.b, 0, level, 0, -					     PIPE_BIND_DEPTH_STENCIL); - -	cbsurf = ctx->screen->get_tex_surface(ctx->screen, texture->flushed_depth_texture, 0, level, 0, -					      PIPE_BIND_RENDER_TARGET); - -	r600_blitter_save_states(ctx); -	util_blitter_save_framebuffer(rctx->blitter, &fb); - -	if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || -		rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) -		depth = 0.0f; - -	util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, rctx->custom_dsa_flush, depth); - -	pipe_surface_reference(&zsurf, NULL); -	pipe_surface_reference(&cbsurf, NULL); -	for (int i = 0; i < fb.nr_cbufs; i++) { -		pipe_surface_reference(&fb.cbufs[i], NULL); -	} -	pipe_surface_reference(&fb.zsbuf, NULL); -	r600_context_queries_resume(&rctx->ctx); - -	return 0; -} - -static void r600_clear(struct pipe_context *ctx, unsigned buffers, -			const float *rgba, double depth, unsigned stencil) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; -	struct pipe_framebuffer_state *fb = &rctx->framebuffer; - -	r600_context_queries_suspend(&rctx->ctx); -	r600_blitter_save_states(ctx); -	util_blitter_clear(rctx->blitter, fb->width, fb->height, -				fb->nr_cbufs, buffers, rgba, depth, -				stencil); -	r600_context_queries_resume(&rctx->ctx); -} - -static void r600_clear_render_target(struct pipe_context *ctx, -				     struct pipe_surface *dst, -				     const float *rgba, -				     unsigned dstx, unsigned dsty, -				     unsigned width, unsigned height) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; -	struct pipe_framebuffer_state *fb = &rctx->framebuffer; - -	r600_context_queries_suspend(&rctx->ctx); -	util_blitter_save_framebuffer(rctx->blitter, fb); -	util_blitter_clear_render_target(rctx->blitter, dst, rgba, -					 dstx, dsty, width, height); -	r600_context_queries_resume(&rctx->ctx); -} - -static void r600_clear_depth_stencil(struct pipe_context *ctx, -				     struct pipe_surface *dst, -				     unsigned clear_flags, -				     double depth, -				     unsigned stencil, -				     unsigned dstx, unsigned dsty, -				     unsigned width, unsigned height) -{ -	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; -	struct pipe_framebuffer_state *fb = &rctx->framebuffer; - -	r600_context_queries_suspend(&rctx->ctx); -	util_blitter_save_framebuffer(rctx->blitter, fb); -	util_blitter_clear_depth_stencil(rctx->blitter, dst, clear_flags, depth, stencil, -					 dstx, dsty, width, height); -	r600_context_queries_resume(&rctx->ctx); -} - - -static void r600_resource_copy_region(struct pipe_context *ctx, -				      struct pipe_resource *dst, -				      struct pipe_subresource subdst, -				      unsigned dstx, unsigned dsty, unsigned dstz, -				      struct pipe_resource *src, -				      struct pipe_subresource subsrc, -				      unsigned srcx, unsigned srcy, unsigned srcz, -				      unsigned width, unsigned height) -{ -	util_resource_copy_region(ctx, dst, subdst, dstx, dsty, dstz, -				  src, subsrc, srcx, srcy, srcz, width, height); -} - -void r600_init_blit_functions2(struct r600_pipe_context *rctx) -{ -	rctx->context.clear = r600_clear; -	rctx->context.clear_render_target = r600_clear_render_target; -	rctx->context.clear_depth_stencil = r600_clear_depth_stencil; -	rctx->context.resource_copy_region = r600_resource_copy_region; -} -  static void r600_set_blend_color(struct pipe_context *ctx,  					const struct pipe_blend_color *state)  { | 
