wined3d: Explicitly pass parameters to shader_load_np2fixup_constants().

This commit is contained in:
Henri Verbeet 2010-10-25 12:33:40 +02:00 committed by Alexandre Julliard
parent 6dd9109358
commit 5ef7a8c242
5 changed files with 35 additions and 45 deletions

View File

@ -480,20 +480,13 @@ static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl *This, con
/**
* Loads the texture dimensions for NP2 fixup into the currently set ARB_[vertex/fragment]_programs.
*/
static void shader_arb_load_np2fixup_constants(
IWineD3DDevice* device,
char usePixelShader,
char useVertexShader) {
static void shader_arb_load_np2fixup_constants(void *shader_priv,
const struct wined3d_gl_info *gl_info, const struct wined3d_state *state)
{
const struct shader_arb_priv * priv = shader_priv;
IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl *) device;
const struct shader_arb_priv* const priv = (const struct shader_arb_priv *) deviceImpl->shader_priv;
IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock;
const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
if (!usePixelShader) {
/* NP2 texcoord fixup is (currently) only done for pixelshaders. */
return;
}
if (!use_ps(state)) return;
if (priv->compiled_fprog && priv->compiled_fprog->np2fixup_info.super.active) {
const struct arb_ps_np2fixup_info* const fixup = &priv->compiled_fprog->np2fixup_info;
@ -501,9 +494,10 @@ static void shader_arb_load_np2fixup_constants(
WORD active = fixup->super.active;
GLfloat np2fixup_constants[4 * MAX_FRAGMENT_SAMPLERS];
for (i = 0; active; active >>= 1, ++i) {
for (i = 0; active; active >>= 1, ++i)
{
const IWineD3DBaseTextureImpl *tex = state->textures[i];
const unsigned char idx = fixup->super.idx[i];
const IWineD3DBaseTextureImpl *tex = stateBlock->state.textures[i];
GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4];
if (!(active & 1)) continue;
@ -4574,7 +4568,7 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS,
/* Force constant reloading for the NP2 fixup (see comment in shader_glsl_select for more info) */
if (compiled->np2fixup_info.super.active)
shader_arb_load_np2fixup_constants((IWineD3DDevice *)This, usePS, useVS);
shader_arb_load_np2fixup_constants(priv, gl_info, state);
}
else if (gl_info->supported[ARB_FRAGMENT_PROGRAM] && !priv->use_arbfp_fixed_func)
{

View File

@ -681,34 +681,28 @@ static void reset_program_constant_version(struct wine_rb_entry *entry, void *co
* Loads the texture dimensions for NP2 fixup into the currently set GLSL program.
*/
/* GL locking is done by the caller (state handler) */
static void shader_glsl_load_np2fixup_constants(
IWineD3DDevice* device,
char usePixelShader,
char useVertexShader) {
static void shader_glsl_load_np2fixup_constants(void *shader_priv,
const struct wined3d_gl_info *gl_info, const struct wined3d_state *state)
{
struct shader_glsl_priv *glsl_priv = shader_priv;
const struct glsl_shader_prog_link *prog = glsl_priv->glsl_program;
const IWineD3DDeviceImpl* deviceImpl = (const IWineD3DDeviceImpl*) device;
const struct glsl_shader_prog_link* prog = ((struct shader_glsl_priv *)(deviceImpl->shader_priv))->glsl_program;
if (!prog) {
/* No GLSL program set - nothing to do. */
return;
}
if (!prog) return;
if (!usePixelShader) {
/* NP2 texcoord fixup is (currently) only done for pixelshaders. */
return;
}
if (!use_ps(state)) return;
if (prog->ps_args.np2_fixup && -1 != prog->np2Fixup_location) {
const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info;
const IWineD3DStateBlockImpl* stateBlock = (const IWineD3DStateBlockImpl*) deviceImpl->stateBlock;
if (prog->ps_args.np2_fixup && prog->np2Fixup_location != -1)
{
UINT i;
UINT fixup = prog->ps_args.np2_fixup;
GLfloat np2fixup_constants[4 * MAX_FRAGMENT_SAMPLERS];
for (i = 0; fixup; fixup >>= 1, ++i) {
for (i = 0; fixup; fixup >>= 1, ++i)
{
const IWineD3DBaseTextureImpl *tex = state->textures[i];
const unsigned char idx = prog->np2Fixup_info->idx[i];
const IWineD3DBaseTextureImpl *tex = stateBlock->state.textures[i];
GLfloat *tex_dim = &np2fixup_constants[(idx >> 1) * 4];
if (!tex)
@ -4619,7 +4613,7 @@ static void shader_glsl_select(const struct wined3d_context *context, BOOL usePS
* called between selecting the shader and using it, which results in wrong fixup for some frames. */
if (priv->glsl_program && priv->glsl_program->np2Fixup_info)
{
shader_glsl_load_np2fixup_constants((IWineD3DDevice *)device, usePS, useVS);
shader_glsl_load_np2fixup_constants(priv, gl_info, &device->stateBlock->state);
}
}

View File

@ -1508,7 +1508,8 @@ static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {}
static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {}
static void shader_none_load_np2fixup_constants(void *shader_priv,
const struct wined3d_gl_info *gl_info, const struct wined3d_state *state) {}
static void shader_none_destroy(IWineD3DBaseShader *iface) {}
static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;}
static void shader_none_free(IWineD3DDevice *iface) {}

View File

@ -3614,7 +3614,8 @@ static void sampler_texmatrix(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void sampler(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD sampler = state_id - STATE_SAMPLER(0);
DWORD mapped_stage = stateblock->device->texUnitMap[sampler];
IWineD3DDeviceImpl *device = stateblock->device;
DWORD mapped_stage = device->texUnitMap[sampler];
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_state *state = &stateblock->state;
union {
@ -3673,9 +3674,7 @@ static void sampler(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct w
/* Trigger shader constant reloading (for NP2 texcoord fixup) */
if (!state->textures[sampler]->baseTexture.pow2Matrix_identity)
{
IWineD3DDeviceImpl *d3ddevice = stateblock->device;
d3ddevice->shader_backend->shader_load_np2fixup_constants(
(IWineD3DDevice*)d3ddevice, use_ps(state), use_vs(state));
device->shader_backend->shader_load_np2fixup_constants(device->shader_priv, gl_info, state);
}
}
else if (mapped_stage < gl_info->limits.textures)
@ -3691,8 +3690,8 @@ static void sampler(DWORD state_id, IWineD3DStateBlockImpl *stateblock, struct w
state_alpha(WINED3DRS_COLORKEYENABLE, stateblock, context);
}
} /* Otherwise tex_colorop disables the stage */
glBindTexture(GL_TEXTURE_2D, stateblock->device->dummyTextureName[sampler]);
checkGLcall("glBindTexture(GL_TEXTURE_2D, stateblock->device->dummyTextureName[sampler])");
glBindTexture(GL_TEXTURE_2D, device->dummyTextureName[sampler]);
checkGLcall("glBindTexture(GL_TEXTURE_2D, device->dummyTextureName[sampler])");
}
}

View File

@ -723,6 +723,7 @@ struct vs_compile_args {
};
struct wined3d_context;
struct wined3d_state;
typedef struct {
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
@ -732,7 +733,8 @@ typedef struct {
void (*shader_update_float_vertex_constants)(IWineD3DDevice *iface, UINT start, UINT count);
void (*shader_update_float_pixel_constants)(IWineD3DDevice *iface, UINT start, UINT count);
void (*shader_load_constants)(const struct wined3d_context *context, char usePS, char useVS);
void (*shader_load_np2fixup_constants)(IWineD3DDevice *iface, char usePS, char useVS);
void (*shader_load_np2fixup_constants)(void *shader_priv, const struct wined3d_gl_info *gl_info,
const struct wined3d_state *state);
void (*shader_destroy)(IWineD3DBaseShader *iface);
HRESULT (*shader_alloc_private)(IWineD3DDevice *iface);
void (*shader_free_private)(IWineD3DDevice *iface);