diff options
-rw-r--r-- | src/gallium/state_trackers/nine/adapter9.h | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/device9.c | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/device9.h | 4 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/surface9.c | 6 | ||||
-rw-r--r-- | src/gallium/state_trackers/nine/volume9.c | 6 | ||||
-rw-r--r-- | src/gallium/targets/d3dadapter9/drm.c | 6 | ||||
-rw-r--r-- | src/util/xmlpool/t_options.h | 5 |
7 files changed, 28 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/nine/adapter9.h b/src/gallium/state_trackers/nine/adapter9.h index 60be056f892..ba20a3abe87 100644 --- a/src/gallium/state_trackers/nine/adapter9.h +++ b/src/gallium/state_trackers/nine/adapter9.h @@ -42,6 +42,7 @@ struct d3dadapter9_context BOOL discard_delayed_release; BOOL tearfree_discard; int csmt_force; + BOOL dynamic_texture_workaround; void (*destroy)( struct d3dadapter9_context *ctx ); }; diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c index e7317238e6c..2cc3a9465fa 100644 --- a/src/gallium/state_trackers/nine/device9.c +++ b/src/gallium/state_trackers/nine/device9.c @@ -291,6 +291,8 @@ NineDevice9_ctor( struct NineDevice9 *This, if (This->csmt_active) DBG("\033[1;32mCSMT is active\033[0m\n"); + This->workarounds.dynamic_texture_workaround = pCTX->dynamic_texture_workaround; + This->buffer_upload = nine_upload_create(This->pipe_secondary, 4 * 1024 * 1024, 4); /* Initialize a dummy VBO to be used when a vertex declaration does not diff --git a/src/gallium/state_trackers/nine/device9.h b/src/gallium/state_trackers/nine/device9.h index 4cce29a28e0..167a830d824 100644 --- a/src/gallium/state_trackers/nine/device9.h +++ b/src/gallium/state_trackers/nine/device9.h @@ -138,6 +138,10 @@ struct NineDevice9 boolean buggy_barycentrics; } driver_bugs; + struct { + boolean dynamic_texture_workaround; + } workarounds; + struct u_upload_mgr *vertex_uploader; struct nine_range_pool range_pool; diff --git a/src/gallium/state_trackers/nine/surface9.c b/src/gallium/state_trackers/nine/surface9.c index d57d13ef7c6..db74de2823a 100644 --- a/src/gallium/state_trackers/nine/surface9.c +++ b/src/gallium/state_trackers/nine/surface9.c @@ -146,7 +146,11 @@ NineSurface9_ctor( struct NineSurface9 *This, This->base.info.bind, FALSE, TRUE); - if (This->base.info.format != This->format_internal) { + if (This->base.info.format != This->format_internal || + /* DYNAMIC Textures requires same stride as ram buffers. + * Do not use workaround by default as it eats more virtual space */ + (pParams->device->workarounds.dynamic_texture_workaround && + pDesc->Pool == D3DPOOL_DEFAULT && pDesc->Usage & D3DUSAGE_DYNAMIC)) { This->data_internal = align_calloc( nine_format_get_level_alloc_size(This->format_internal, pDesc->Width, diff --git a/src/gallium/state_trackers/nine/volume9.c b/src/gallium/state_trackers/nine/volume9.c index ab0a82e288d..7a844b28387 100644 --- a/src/gallium/state_trackers/nine/volume9.c +++ b/src/gallium/state_trackers/nine/volume9.c @@ -118,7 +118,11 @@ NineVolume9_ctor( struct NineVolume9 *This, This->info.nr_samples, This->info.bind, FALSE, TRUE); - if (This->info.format != This->format_internal) { + if (This->info.format != This->format_internal || + /* DYNAMIC Textures requires same stride as ram buffers. + * Do not use workaround by default as it eats more virtual space */ + (pParams->device->workarounds.dynamic_texture_workaround && + pDesc->Pool == D3DPOOL_DEFAULT && pDesc->Usage & D3DUSAGE_DYNAMIC)) { This->stride_internal = nine_format_get_stride(This->format_internal, pDesc->Width); This->layer_stride_internal = util_format_get_2d_size(This->format_internal, diff --git a/src/gallium/targets/d3dadapter9/drm.c b/src/gallium/targets/d3dadapter9/drm.c index 4418ceb93d6..b9ae076c544 100644 --- a/src/gallium/targets/d3dadapter9/drm.c +++ b/src/gallium/targets/d3dadapter9/drm.c @@ -59,6 +59,7 @@ DRI_CONF_BEGIN DRI_CONF_NINE_ALLOWDISCARDDELAYEDRELEASE("true") DRI_CONF_NINE_TEARFREEDISCARD("false") DRI_CONF_NINE_CSMT(-1) + DRI_CONF_NINE_DYNAMICTEXTUREWORKAROUND("false") DRI_CONF_SECTION_END DRI_CONF_END; @@ -298,6 +299,11 @@ drm_create_adapter( int fd, else ctx->base.csmt_force = -1; + if (driCheckOption(&userInitOptions, "dynamic_texture_workaround", DRI_BOOL)) + ctx->base.dynamic_texture_workaround = driQueryOptionb(&userInitOptions, "dynamic_texture_workaround"); + else + ctx->base.dynamic_texture_workaround = FALSE; + driDestroyOptionCache(&userInitOptions); driDestroyOptionInfo(&defaultInitOptions); diff --git a/src/util/xmlpool/t_options.h b/src/util/xmlpool/t_options.h index bafecb7c781..1cc9ec33055 100644 --- a/src/util/xmlpool/t_options.h +++ b/src/util/xmlpool/t_options.h @@ -324,6 +324,11 @@ DRI_CONF_OPT_BEGIN(csmt_force, int, def) \ DRI_CONF_DESC(en,gettext("If set to 1, force gallium nine CSMT. If set to 0, disable it. By default (-1) CSMT is enabled on known thread-safe drivers.")) \ DRI_CONF_OPT_END +#define DRI_CONF_NINE_DYNAMICTEXTUREWORKAROUND(def) \ +DRI_CONF_OPT_BEGIN_B(dynamic_texture_workaround, def) \ + DRI_CONF_DESC(en,gettext("If set to true, use a ram intermediate buffer for dynamic textures. Increases ram usage, which can cause out of memory issues, but can fix glitches for some games.")) \ +DRI_CONF_OPT_END + /** * \brief radeonsi specific configuration options */ |