mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-01 03:10:09 +01:00
st/nine: Change the way nine_shader gets the pipe
The change is required with csmt, where depending on the thread you don't access the pipe the same way. Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
parent
97e4b65e7f
commit
f5f881fd3e
4 changed files with 20 additions and 9 deletions
|
|
@ -3464,13 +3464,12 @@ shader_add_ps_fog_stage(struct shader_translator *tx, struct ureg_src src_col)
|
|||
screen, info->type, PIPE_SHADER_CAP_##n)
|
||||
|
||||
HRESULT
|
||||
nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info)
|
||||
nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *info, struct pipe_context *pipe)
|
||||
{
|
||||
struct shader_translator *tx;
|
||||
HRESULT hr = D3D_OK;
|
||||
const unsigned processor = info->type;
|
||||
struct pipe_screen *screen = info->process_vertices ? device->screen_sw : device->screen;
|
||||
struct pipe_context *pipe = info->process_vertices ? device->pipe_sw : NineDevice9_GetPipe(device);
|
||||
|
||||
user_assert(processor != ~0, D3DERR_INVALIDCALL);
|
||||
|
||||
|
|
|
|||
|
|
@ -114,7 +114,9 @@ nine_info_mark_const_b_used(struct nine_shader_info *info, int idx)
|
|||
}
|
||||
|
||||
HRESULT
|
||||
nine_translate_shader(struct NineDevice9 *device, struct nine_shader_info *);
|
||||
nine_translate_shader(struct NineDevice9 *device,
|
||||
struct nine_shader_info *,
|
||||
struct pipe_context *);
|
||||
|
||||
|
||||
struct nine_shader_variant
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This,
|
|||
{
|
||||
struct NineDevice9 *device;
|
||||
struct nine_shader_info info;
|
||||
struct pipe_context *pipe;
|
||||
HRESULT hr;
|
||||
|
||||
DBG("This=%p pParams=%p pFunction=%p cso=%p\n", This, pParams, pFunction, cso);
|
||||
|
|
@ -50,6 +51,7 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This,
|
|||
return D3D_OK;
|
||||
}
|
||||
device = This->base.device;
|
||||
pipe = NineDevice9_GetPipe(device);
|
||||
|
||||
info.type = PIPE_SHADER_FRAGMENT;
|
||||
info.byte_code = pFunction;
|
||||
|
|
@ -61,7 +63,7 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This,
|
|||
info.projected = 0;
|
||||
info.process_vertices = false;
|
||||
|
||||
hr = nine_translate_shader(device, &info);
|
||||
hr = nine_translate_shader(device, &info, pipe);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
This->byte_code.version = info.version;
|
||||
|
|
@ -140,6 +142,9 @@ NinePixelShader9_GetFunction( struct NinePixelShader9 *This,
|
|||
void *
|
||||
NinePixelShader9_GetVariant( struct NinePixelShader9 *This )
|
||||
{
|
||||
/* GetVariant is called from nine_context, thus we can
|
||||
* get pipe directly */
|
||||
struct pipe_context *pipe = This->base.device->context.pipe;
|
||||
void *cso;
|
||||
uint64_t key;
|
||||
|
||||
|
|
@ -165,7 +170,7 @@ NinePixelShader9_GetVariant( struct NinePixelShader9 *This )
|
|||
info.projected = (key >> 48) & 0xffff;
|
||||
info.process_vertices = false;
|
||||
|
||||
hr = nine_translate_shader(This->base.device, &info);
|
||||
hr = nine_translate_shader(This->base.device, &info, pipe);
|
||||
if (FAILED(hr))
|
||||
return NULL;
|
||||
nine_shader_variant_add(&This->variant, key, info.cso);
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ NineVertexShader9_ctor( struct NineVertexShader9 *This,
|
|||
{
|
||||
struct NineDevice9 *device;
|
||||
struct nine_shader_info info;
|
||||
struct pipe_context *pipe;
|
||||
HRESULT hr;
|
||||
unsigned i;
|
||||
|
||||
|
|
@ -55,6 +56,7 @@ NineVertexShader9_ctor( struct NineVertexShader9 *This,
|
|||
}
|
||||
|
||||
device = This->base.device;
|
||||
pipe = NineDevice9_GetPipe(device);
|
||||
|
||||
info.type = PIPE_SHADER_VERTEX;
|
||||
info.byte_code = pFunction;
|
||||
|
|
@ -68,12 +70,12 @@ NineVertexShader9_ctor( struct NineVertexShader9 *This,
|
|||
info.swvp_on = !!(device->params.BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING);
|
||||
info.process_vertices = false;
|
||||
|
||||
hr = nine_translate_shader(device, &info);
|
||||
hr = nine_translate_shader(device, &info, pipe);
|
||||
if (hr == D3DERR_INVALIDCALL &&
|
||||
(device->params.BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING)) {
|
||||
/* Retry with a swvp shader. It will require swvp to be on. */
|
||||
info.swvp_on = true;
|
||||
hr = nine_translate_shader(device, &info);
|
||||
hr = nine_translate_shader(device, &info, pipe);
|
||||
}
|
||||
if (hr == D3DERR_INVALIDCALL)
|
||||
ERR("Encountered buggy shader\n");
|
||||
|
|
@ -168,6 +170,9 @@ NineVertexShader9_GetFunction( struct NineVertexShader9 *This,
|
|||
void *
|
||||
NineVertexShader9_GetVariant( struct NineVertexShader9 *This )
|
||||
{
|
||||
/* GetVariant is called from nine_context, thus we can
|
||||
* get pipe directly */
|
||||
struct pipe_context *pipe = This->base.device->context.pipe;
|
||||
void *cso;
|
||||
uint64_t key;
|
||||
|
||||
|
|
@ -192,7 +197,7 @@ NineVertexShader9_GetVariant( struct NineVertexShader9 *This )
|
|||
info.swvp_on = device->swvp;
|
||||
info.process_vertices = false;
|
||||
|
||||
hr = nine_translate_shader(This->base.device, &info);
|
||||
hr = nine_translate_shader(This->base.device, &info, pipe);
|
||||
if (FAILED(hr))
|
||||
return NULL;
|
||||
nine_shader_variant_add(&This->variant, key, info.cso);
|
||||
|
|
@ -229,7 +234,7 @@ NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9 *This,
|
|||
info.swvp_on = true;
|
||||
info.vdecl_out = vdecl_out;
|
||||
info.process_vertices = true;
|
||||
hr = nine_translate_shader(This->base.device, &info);
|
||||
hr = nine_translate_shader(This->base.device, &info, This->base.device->pipe_sw);
|
||||
if (FAILED(hr))
|
||||
return NULL;
|
||||
*so = info.so;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue