Commit 6d2f710d authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Pas a wined3d_vec4 structure to shader_arb_load_constants_f().

parent f33c79d3
......@@ -360,21 +360,20 @@ static unsigned int reserved_vs_const(const struct arb_vshader_private *shader_d
* or GL_FRAGMENT_PROGRAM_ARB (for pixel shaders)
*/
/* Context activation is done by the caller. */
static unsigned int shader_arb_load_constantsF(const struct wined3d_shader *shader,
static unsigned int shader_arb_load_constants_f(const struct wined3d_shader *shader,
const struct wined3d_gl_info *gl_info, GLuint target_type, unsigned int max_constants,
const float *constants, char *dirty_consts)
const struct wined3d_vec4 *constants, char *dirty_consts)
{
struct wined3d_shader_lconst *lconst;
DWORD i, j;
unsigned int ret;
unsigned int ret, i, j;
if (TRACE_ON(d3d_constants))
{
for(i = 0; i < max_constants; i++) {
if(!dirty_consts[i]) continue;
TRACE_(d3d_constants)("Loading constants %i: %f, %f, %f, %f\n", i,
constants[i * 4 + 0], constants[i * 4 + 1],
constants[i * 4 + 2], constants[i * 4 + 3]);
for (i = 0; i < max_constants; ++i)
{
if (!dirty_consts[i])
continue;
TRACE_(d3d_constants)("Loading constant %u: %s.\n", i, debug_vec4(&constants[i]));
}
}
......@@ -387,26 +386,39 @@ static unsigned int shader_arb_load_constantsF(const struct wined3d_shader *shad
/* ps 1.x supports only 8 constants, clamp only those. When switching between 1.x and higher
* shaders, the first 8 constants are marked dirty for reload
*/
for(; i < min(8, max_constants); i++) {
if(!dirty_consts[i]) continue;
for (; i < min(8, max_constants); ++i)
{
if (!dirty_consts[i])
continue;
dirty_consts[i] = 0;
j = 4 * i;
if (constants[j + 0] > 1.0f) lcl_const[0] = 1.0f;
else if (constants[j + 0] < -1.0f) lcl_const[0] = -1.0f;
else lcl_const[0] = constants[j + 0];
if (constants[i].x > 1.0f)
lcl_const[0] = 1.0f;
else if (constants[i].x < -1.0f)
lcl_const[0] = -1.0f;
else
lcl_const[0] = constants[i].x;
if (constants[j + 1] > 1.0f) lcl_const[1] = 1.0f;
else if (constants[j + 1] < -1.0f) lcl_const[1] = -1.0f;
else lcl_const[1] = constants[j + 1];
if (constants[i].y > 1.0f)
lcl_const[1] = 1.0f;
else if (constants[i].y < -1.0f)
lcl_const[1] = -1.0f;
else
lcl_const[1] = constants[i].y;
if (constants[j + 2] > 1.0f) lcl_const[2] = 1.0f;
else if (constants[j + 2] < -1.0f) lcl_const[2] = -1.0f;
else lcl_const[2] = constants[j + 2];
if (constants[i].z > 1.0f)
lcl_const[2] = 1.0f;
else if (constants[i].z < -1.0f)
lcl_const[2] = -1.0f;
else
lcl_const[2] = constants[i].z;
if (constants[j + 3] > 1.0f) lcl_const[3] = 1.0f;
else if (constants[j + 3] < -1.0f) lcl_const[3] = -1.0f;
else lcl_const[3] = constants[j + 3];
if (constants[i].w > 1.0f)
lcl_const[3] = 1.0f;
else if (constants[i].w < -1.0f)
lcl_const[3] = -1.0f;
else
lcl_const[3] = constants[i].w;
GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, lcl_const));
}
......@@ -427,23 +439,30 @@ static unsigned int shader_arb_load_constantsF(const struct wined3d_shader *shad
*
GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, i, max_constants, constants + (i * 4)));
*/
for(; i < max_constants; i++) {
if(!dirty_consts[i]) continue;
for (; i < max_constants; ++i)
{
if (!dirty_consts[i])
continue;
/* Find the next block of dirty constants */
dirty_consts[i] = 0;
j = i;
for(i++; (i < max_constants) && dirty_consts[i]; i++) {
for (++i; (i < max_constants) && dirty_consts[i]; ++i)
{
dirty_consts[i] = 0;
}
GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, j, i - j, constants + (j * 4)));
GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, j, i - j, &constants[j].x));
}
} else {
for(; i < max_constants; i++) {
if(dirty_consts[i]) {
}
else
{
for (; i < max_constants; ++i)
{
if (dirty_consts[i])
{
dirty_consts[i] = 0;
GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4)));
GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, &constants[i].x));
}
}
}
......@@ -675,8 +694,8 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv,
const struct arb_vs_compiled_shader *gl_shader = priv->compiled_vprog;
/* Load DirectX 9 float constants for vertex shader */
priv->highest_dirty_vs_const = shader_arb_load_constantsF(vshader, gl_info, GL_VERTEX_PROGRAM_ARB,
priv->highest_dirty_vs_const, state->vs_consts_f, priv->vshader_const_dirty);
priv->highest_dirty_vs_const = shader_arb_load_constants_f(vshader, gl_info, GL_VERTEX_PROGRAM_ARB,
priv->highest_dirty_vs_const, (struct wined3d_vec4 *)state->vs_consts_f, priv->vshader_const_dirty);
shader_arb_vs_local_constants(gl_shader, context, state);
}
......@@ -687,8 +706,8 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv,
UINT rt_height = state->fb->render_targets[0]->height;
/* Load DirectX 9 float constants for pixel shader */
priv->highest_dirty_ps_const = shader_arb_load_constantsF(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB,
priv->highest_dirty_ps_const, state->ps_consts_f, priv->pshader_const_dirty);
priv->highest_dirty_ps_const = shader_arb_load_constants_f(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB,
priv->highest_dirty_ps_const, (struct wined3d_vec4 *)state->ps_consts_f, priv->pshader_const_dirty);
shader_arb_ps_local_constants(gl_shader, context, state, rt_height);
if (context->constant_update_mask & WINED3D_SHADER_CONST_PS_NP2_FIXUP)
......
......@@ -3365,6 +3365,14 @@ const char *debug_color(const struct wined3d_color *color)
color->r, color->g, color->b, color->a);
}
const char *debug_vec4(const struct wined3d_vec4 *v)
{
if (!v)
return "(null)";
return wine_dbg_sprintf("{%.8e, %.8e, %.8e, %.8e}",
v->x, v->y, v->z, v->w);
}
const char *debug_d3dformat(enum wined3d_format_id format_id)
{
switch (format_id)
......
......@@ -3095,13 +3095,14 @@ const char *debug_d3dsamplerstate(enum wined3d_sampler_state state) DECLSPEC_HID
const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN;
const char *debug_d3dtexturefiltertype(enum wined3d_texture_filter_type filter_type) DECLSPEC_HIDDEN;
const char *debug_d3dtexturestate(enum wined3d_texture_stage_state state) DECLSPEC_HIDDEN;
const char *debug_d3dtop(enum wined3d_texture_op d3dtop) DECLSPEC_HIDDEN;
const char *debug_d3dtstype(enum wined3d_transform_state tstype) DECLSPEC_HIDDEN;
const char *debug_d3dpool(enum wined3d_pool pool) DECLSPEC_HIDDEN;
const char *debug_fboattachment(GLenum attachment) DECLSPEC_HIDDEN;
const char *debug_fbostatus(GLenum status) DECLSPEC_HIDDEN;
const char *debug_glerror(GLenum error) DECLSPEC_HIDDEN;
const char *debug_d3dtop(enum wined3d_texture_op d3dtop) DECLSPEC_HIDDEN;
const char *debug_shader_type(enum wined3d_shader_type shader_type) DECLSPEC_HIDDEN;
const char *debug_vec4(const struct wined3d_vec4 *v) DECLSPEC_HIDDEN;
void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
BOOL is_invalid_op(const struct wined3d_state *state, int stage,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment