mirror of
https://github.com/reactos/wine.git
synced 2024-11-29 14:40:56 +00:00
wined3d: Use local reg_maps variables where possible.
This commit is contained in:
parent
0405733ff7
commit
e9ff40d918
@ -732,11 +732,12 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
|
||||
if (max_constantsF < 96)
|
||||
max_constantsF = gl_info->limits.arb_vs_float_constants;
|
||||
|
||||
if(This->baseShader.reg_maps.usesrelconstF) {
|
||||
if (reg_maps->usesrelconstF)
|
||||
{
|
||||
DWORD highest_constf = 0, clip_limit;
|
||||
|
||||
max_constantsF -= reserved_vs_const(shader_data, reg_maps, gl_info);
|
||||
max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants);
|
||||
max_constantsF -= count_bits(reg_maps->integer_constants);
|
||||
|
||||
for(i = 0; i < This->baseShader.limits.constant_float; i++)
|
||||
{
|
||||
@ -821,7 +822,8 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
|
||||
* local constants do not declare the loaded constants as an array because ARB compilers usually
|
||||
* do not optimize unused constants away
|
||||
*/
|
||||
if(This->baseShader.reg_maps.usesrelconstF) {
|
||||
if (reg_maps->usesrelconstF)
|
||||
{
|
||||
/* Need to PARAM the environment parameters (constants) so we can use relative addressing */
|
||||
shader_addline(buffer, "PARAM C[%d] = { program.env[0..%d] };\n",
|
||||
max_constantsF, max_constantsF - 1);
|
||||
@ -830,7 +832,8 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
|
||||
DWORD idx, mask;
|
||||
idx = i >> 5;
|
||||
mask = 1 << (i & 0x1f);
|
||||
if(!shader_constant_is_local(This, i) && (This->baseShader.reg_maps.constf[idx] & mask)) {
|
||||
if (!shader_constant_is_local(This, i) && (reg_maps->constf[idx] & mask))
|
||||
{
|
||||
shader_addline(buffer, "PARAM C%d = program.env[%d];\n",i, i);
|
||||
}
|
||||
}
|
||||
@ -3588,7 +3591,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
|
||||
priv_ctx.target_version = ARB;
|
||||
}
|
||||
|
||||
if(This->baseShader.reg_maps.highest_render_target > 0)
|
||||
if (reg_maps->highest_render_target > 0)
|
||||
{
|
||||
shader_addline(buffer, "OPTION ARB_draw_buffers;\n");
|
||||
}
|
||||
@ -4169,8 +4172,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
|
||||
const char *one = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_ONE);
|
||||
for(i = 0; i < min(8, MAX_REG_TEXCRD); i++)
|
||||
{
|
||||
if (This->baseShader.reg_maps.texcoord_mask[i]
|
||||
&& This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL)
|
||||
if (reg_maps->texcoord_mask[i] && reg_maps->texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL)
|
||||
shader_addline(buffer, "MOV result.texcoord[%u].w, %s\n", i, one);
|
||||
}
|
||||
}
|
||||
|
@ -951,25 +951,29 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
|
||||
}
|
||||
else
|
||||
{
|
||||
if(This->baseShader.reg_maps.usesrelconstF) {
|
||||
/* Subtract the other potential uniforms from the max available (bools, ints, and 1 row of projection matrix).
|
||||
* Subtract another uniform for immediate values, which have to be loaded via uniform by the driver as well.
|
||||
* The shader code only uses 0.5, 2.0, 1.0, 128 and -128 in vertex shader code, so one vec4 should be enough
|
||||
* (Unfortunately the Nvidia driver doesn't store 128 and -128 in one float).
|
||||
if (reg_maps->usesrelconstF)
|
||||
{
|
||||
/* Subtract the other potential uniforms from the max
|
||||
* available (bools, ints, and 1 row of projection matrix).
|
||||
* Subtract another uniform for immediate values, which have
|
||||
* to be loaded via uniform by the driver as well. The shader
|
||||
* code only uses 0.5, 2.0, 1.0, 128 and -128 in vertex
|
||||
* shader code, so one vec4 should be enough. (Unfortunately
|
||||
* the Nvidia driver doesn't store 128 and -128 in one float).
|
||||
*
|
||||
* Writing gl_ClipVertex requires one uniform for each clipplane as well.
|
||||
*/
|
||||
* Writing gl_ClipVertex requires one uniform for each
|
||||
* clipplane as well. */
|
||||
max_constantsF = gl_info->limits.glsl_vs_float_constants - 3;
|
||||
if(ctx_priv->cur_vs_args->clip_enabled)
|
||||
{
|
||||
max_constantsF -= gl_info->limits.clipplanes;
|
||||
}
|
||||
max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants);
|
||||
max_constantsF -= count_bits(reg_maps->integer_constants);
|
||||
/* Strictly speaking a bool only uses one scalar, but the nvidia(Linux) compiler doesn't pack them properly,
|
||||
* so each scalar requires a full vec4. We could work around this by packing the booleans ourselves, but
|
||||
* for now take this into account when calculating the number of available constants
|
||||
*/
|
||||
max_constantsF -= count_bits(This->baseShader.reg_maps.boolean_constants);
|
||||
max_constantsF -= count_bits(reg_maps->boolean_constants);
|
||||
/* Set by driver quirks in directx.c */
|
||||
max_constantsF -= gl_info->reserved_glsl_constants;
|
||||
}
|
||||
@ -985,10 +989,10 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
|
||||
/* Always declare the full set of constants, the compiler can remove the unused ones because d3d doesn't(yet)
|
||||
* support indirect int and bool constant addressing. This avoids problems if the app uses e.g. i0 and i9.
|
||||
*/
|
||||
if (This->baseShader.limits.constant_int > 0 && This->baseShader.reg_maps.integer_constants)
|
||||
if (This->baseShader.limits.constant_int > 0 && reg_maps->integer_constants)
|
||||
shader_addline(buffer, "uniform ivec4 %cI[%u];\n", prefix, This->baseShader.limits.constant_int);
|
||||
|
||||
if (This->baseShader.limits.constant_bool > 0 && This->baseShader.reg_maps.boolean_constants)
|
||||
if (This->baseShader.limits.constant_bool > 0 && reg_maps->boolean_constants)
|
||||
shader_addline(buffer, "uniform bool %cB[%u];\n", prefix, This->baseShader.limits.constant_bool);
|
||||
|
||||
if (!pshader)
|
||||
|
@ -1864,7 +1864,7 @@ HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *
|
||||
return hr;
|
||||
}
|
||||
|
||||
map = shader->baseShader.reg_maps.input_registers;
|
||||
map = reg_maps->input_registers;
|
||||
for (i = 0; map; map >>= 1, ++i)
|
||||
{
|
||||
if (!(map & 1) || !shader->baseShader.input_signature[i].semantic_name) continue;
|
||||
@ -1886,7 +1886,7 @@ HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *
|
||||
|
||||
vertexshader_set_limits(shader);
|
||||
|
||||
shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF
|
||||
shader->baseShader.load_local_constsF = reg_maps->usesrelconstF
|
||||
&& !list_empty(&shader->baseShader.constantsF);
|
||||
|
||||
return WINED3D_OK;
|
||||
|
Loading…
Reference in New Issue
Block a user