diff options
author | Marek Olšák <maraeo@gmail.com> | 2013-03-14 17:18:43 +0100 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2013-03-23 13:19:16 +0100 |
commit | 3e10ab6b22341c06a9352b1e029b923f4d8405b9 (patch) | |
tree | ac3dd22bf0f641b69562204066df4c2e211ef8a6 | |
parent | 25e3094058977648a6f552d59b728a9ea814b7c2 (diff) |
gallium,st/mesa: don't use blit-based transfers with software rasterizers
The blit-based paths for TexImage, GetTexImage, and ReadPixels aren't very
fast with software rasterizer. Now Gallium drivers have the ability to turn
them off.
Reviewed-by: Brian Paul <brianp@vmware.com>
Tested-by: Brian Paul <brianp@vmware.com>
-rw-r--r-- | src/gallium/docs/source/screen.rst | 4 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_screen.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nv30/nv30_screen.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_screen.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nvc0/nvc0_screen.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_screen.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/radeonsi_pipe.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_screen.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_screen.c | 3 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_defines.h | 3 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_readpixels.c | 4 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_texture.c | 8 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_context.c | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_context.h | 1 |
15 files changed, 35 insertions, 1 deletions
diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index 0550a30714a..9b8704904ab 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst | |||
@@ -145,6 +145,10 @@ The integer capabilities: | |||
145 | TEXCOORD semantic. | 145 | TEXCOORD semantic. |
146 | Also, TGSI_SEMANTIC_PCOORD becomes available, which labels a fragment shader | 146 | Also, TGSI_SEMANTIC_PCOORD becomes available, which labels a fragment shader |
147 | input that will always be replaced with sprite coordinates. | 147 | input that will always be replaced with sprite coordinates. |
148 | * ``PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER``: Whether it is preferable | ||
149 | to use a blit to implement a texture transfer which needs format conversions | ||
150 | and swizzling in state trackers. Generally, all hardware drivers with | ||
151 | dedicated memory should return 1 and all software rasterizers should return 0. | ||
148 | 152 | ||
149 | 153 | ||
150 | .. _pipe_capf: | 154 | .. _pipe_capf: |
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 6760db0b38f..e8c6ab1f806 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c | |||
@@ -222,6 +222,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) | |||
222 | return 1; | 222 | return 1; |
223 | case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: | 223 | case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: |
224 | return 1; | 224 | return 1; |
225 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
226 | return 0; | ||
225 | } | 227 | } |
226 | /* should only get here on unhandled cases */ | 228 | /* should only get here on unhandled cases */ |
227 | debug_printf("Unexpected PIPE_CAP %d query\n", param); | 229 | debug_printf("Unexpected PIPE_CAP %d query\n", param); |
diff --git a/src/gallium/drivers/nv30/nv30_screen.c b/src/gallium/drivers/nv30/nv30_screen.c index e17ee76fbd1..4084869dba8 100644 --- a/src/gallium/drivers/nv30/nv30_screen.c +++ b/src/gallium/drivers/nv30/nv30_screen.c | |||
@@ -126,6 +126,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) | |||
126 | case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: | 126 | case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: |
127 | case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: | 127 | case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: |
128 | case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: | 128 | case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: |
129 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
129 | return 1; | 130 | return 1; |
130 | default: | 131 | default: |
131 | debug_printf("unknown param %d\n", param); | 132 | debug_printf("unknown param %d\n", param); |
diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c index fb29b2290c2..0a20ae3e924 100644 --- a/src/gallium/drivers/nv50/nv50_screen.c +++ b/src/gallium/drivers/nv50/nv50_screen.c | |||
@@ -187,6 +187,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) | |||
187 | case PIPE_CAP_TGSI_TEXCOORD: | 187 | case PIPE_CAP_TGSI_TEXCOORD: |
188 | case PIPE_CAP_TEXTURE_MULTISAMPLE: | 188 | case PIPE_CAP_TEXTURE_MULTISAMPLE: |
189 | return 0; | 189 | return 0; |
190 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
191 | return 1; | ||
190 | default: | 192 | default: |
191 | NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); | 193 | NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); |
192 | return 0; | 194 | return 0; |
diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c index 73cf0af4d1d..b6cf2ca8a1f 100644 --- a/src/gallium/drivers/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nvc0/nvc0_screen.c | |||
@@ -179,6 +179,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) | |||
179 | return 0; | 179 | return 0; |
180 | case PIPE_CAP_COMPUTE: | 180 | case PIPE_CAP_COMPUTE: |
181 | return (class_3d >= NVE4_3D_CLASS) ? 1 : 0; | 181 | return (class_3d >= NVE4_3D_CLASS) ? 1 : 0; |
182 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
183 | return 1; | ||
182 | default: | 184 | default: |
183 | NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); | 185 | NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); |
184 | return 0; | 186 | return 0; |
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 46fb869cb72..bd16c3b76b1 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c | |||
@@ -106,6 +106,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param) | |||
106 | case PIPE_CAP_USER_INDEX_BUFFERS: | 106 | case PIPE_CAP_USER_INDEX_BUFFERS: |
107 | case PIPE_CAP_USER_CONSTANT_BUFFERS: | 107 | case PIPE_CAP_USER_CONSTANT_BUFFERS: |
108 | case PIPE_CAP_DEPTH_CLIP_DISABLE: /* XXX implemented, but breaks Regnum Online */ | 108 | case PIPE_CAP_DEPTH_CLIP_DISABLE: /* XXX implemented, but breaks Regnum Online */ |
109 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
109 | return 1; | 110 | return 1; |
110 | 111 | ||
111 | case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: | 112 | case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: |
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 7a84f3d5c6e..81448d49ee9 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c | |||
@@ -564,6 +564,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) | |||
564 | case PIPE_CAP_START_INSTANCE: | 564 | case PIPE_CAP_START_INSTANCE: |
565 | case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: | 565 | case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: |
566 | case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: | 566 | case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: |
567 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
567 | return 1; | 568 | return 1; |
568 | case PIPE_CAP_TGSI_TEXCOORD: | 569 | case PIPE_CAP_TGSI_TEXCOORD: |
569 | return 0; | 570 | return 0; |
diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c index 859843867ce..672017a4ec7 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c | |||
@@ -329,6 +329,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) | |||
329 | case PIPE_CAP_USER_CONSTANT_BUFFERS: | 329 | case PIPE_CAP_USER_CONSTANT_BUFFERS: |
330 | case PIPE_CAP_START_INSTANCE: | 330 | case PIPE_CAP_START_INSTANCE: |
331 | case PIPE_CAP_NPOT_TEXTURES: | 331 | case PIPE_CAP_NPOT_TEXTURES: |
332 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
332 | return 1; | 333 | return 1; |
333 | case PIPE_CAP_TGSI_TEXCOORD: | 334 | case PIPE_CAP_TGSI_TEXCOORD: |
334 | return 0; | 335 | return 0; |
diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c index 937035e5511..0261c69197c 100644 --- a/src/gallium/drivers/softpipe/sp_screen.c +++ b/src/gallium/drivers/softpipe/sp_screen.c | |||
@@ -174,6 +174,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) | |||
174 | case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: | 174 | case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: |
175 | return 0; | 175 | return 0; |
176 | case PIPE_CAP_TGSI_TEXCOORD: | 176 | case PIPE_CAP_TGSI_TEXCOORD: |
177 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
177 | return 0; | 178 | return 0; |
178 | } | 179 | } |
179 | /* should only get here on unhandled cases */ | 180 | /* should only get here on unhandled cases */ |
diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index f0831b9f2fe..0558a46c0aa 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c | |||
@@ -224,6 +224,9 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param) | |||
224 | case PIPE_CAP_GLSL_FEATURE_LEVEL: | 224 | case PIPE_CAP_GLSL_FEATURE_LEVEL: |
225 | return 120; | 225 | return 120; |
226 | 226 | ||
227 | case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: | ||
228 | return 1; | ||
229 | |||
227 | /* Unsupported features */ | 230 | /* Unsupported features */ |
228 | case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: | 231 | case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: |
229 | case PIPE_CAP_TEXTURE_MIRROR_CLAMP: | 232 | case PIPE_CAP_TEXTURE_MIRROR_CLAMP: |
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 7f20b992a13..f59e78a1a9e 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h | |||
@@ -499,7 +499,8 @@ enum pipe_cap { | |||
499 | PIPE_CAP_CUBE_MAP_ARRAY = 76, | 499 | PIPE_CAP_CUBE_MAP_ARRAY = 76, |
500 | PIPE_CAP_TEXTURE_BUFFER_OBJECTS = 77, | 500 | PIPE_CAP_TEXTURE_BUFFER_OBJECTS = 77, |
501 | PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 78, | 501 | PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT = 78, |
502 | PIPE_CAP_TGSI_TEXCOORD = 79 | 502 | PIPE_CAP_TGSI_TEXCOORD = 79, |
503 | PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER = 80 | ||
503 | }; | 504 | }; |
504 | 505 | ||
505 | /** | 506 | /** |
diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c index b524738ae29..bfed988701a 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.c +++ b/src/mesa/state_tracker/st_cb_readpixels.c | |||
@@ -83,6 +83,10 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, | |||
83 | st_validate_state(st); | 83 | st_validate_state(st); |
84 | st_flush_bitmap_cache(st); | 84 | st_flush_bitmap_cache(st); |
85 | 85 | ||
86 | if (!st->prefer_blit_based_texture_transfer) { | ||
87 | goto fallback; | ||
88 | } | ||
89 | |||
86 | /* This must be done after state validation. */ | 90 | /* This must be done after state validation. */ |
87 | src = strb->texture; | 91 | src = strb->texture; |
88 | 92 | ||
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 7307c6052c5..94fbbf7bed8 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c | |||
@@ -608,6 +608,10 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims, | |||
608 | unsigned bind; | 608 | unsigned bind; |
609 | GLubyte *map; | 609 | GLubyte *map; |
610 | 610 | ||
611 | if (!st->prefer_blit_based_texture_transfer) { | ||
612 | goto fallback; | ||
613 | } | ||
614 | |||
611 | if (!dst) { | 615 | if (!dst) { |
612 | goto fallback; | 616 | goto fallback; |
613 | } | 617 | } |
@@ -860,6 +864,10 @@ st_GetTexImage(struct gl_context * ctx, | |||
860 | ubyte *map = NULL; | 864 | ubyte *map = NULL; |
861 | boolean done = FALSE; | 865 | boolean done = FALSE; |
862 | 866 | ||
867 | if (!st->prefer_blit_based_texture_transfer) { | ||
868 | goto fallback; | ||
869 | } | ||
870 | |||
863 | if (!stImage->pt) { | 871 | if (!stImage->pt) { |
864 | goto fallback; | 872 | goto fallback; |
865 | } | 873 | } |
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index e2d074d14a4..cc87f2bb38d 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c | |||
@@ -182,6 +182,8 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe, | |||
182 | st->has_stencil_export = | 182 | st->has_stencil_export = |
183 | screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT); | 183 | screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT); |
184 | st->has_shader_model3 = screen->get_param(screen, PIPE_CAP_SM3); | 184 | st->has_shader_model3 = screen->get_param(screen, PIPE_CAP_SM3); |
185 | st->prefer_blit_based_texture_transfer = screen->get_param(screen, | ||
186 | PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER); | ||
185 | 187 | ||
186 | st->needs_texcoord_semantic = | 188 | st->needs_texcoord_semantic = |
187 | screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD); | 189 | screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD); |
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index c6c68adcfb2..8786a036ff4 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h | |||
@@ -84,6 +84,7 @@ struct st_context | |||
84 | boolean has_stencil_export; /**< can do shader stencil export? */ | 84 | boolean has_stencil_export; /**< can do shader stencil export? */ |
85 | boolean has_time_elapsed; | 85 | boolean has_time_elapsed; |
86 | boolean has_shader_model3; | 86 | boolean has_shader_model3; |
87 | boolean prefer_blit_based_texture_transfer; | ||
87 | 88 | ||
88 | boolean needs_texcoord_semantic; | 89 | boolean needs_texcoord_semantic; |
89 | 90 | ||