mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 12:54:13 +00:00
wined3d: Implement vertex texture fetch in ARB.
This commit is contained in:
parent
f1e97cdfbc
commit
7baf7c6518
1 changed files with 24 additions and 2 deletions
|
@ -125,6 +125,11 @@ struct arb_vs_compile_args
|
|||
struct vs_compile_args super;
|
||||
DWORD bools; /* WORD is enough, use DWORD for alignment */
|
||||
DWORD ps_signature;
|
||||
union
|
||||
{
|
||||
unsigned char vertex_samplers[4];
|
||||
DWORD vertex_samplers_compare;
|
||||
};
|
||||
unsigned char loop_ctrl[MAX_CONST_I][3];
|
||||
};
|
||||
|
||||
|
@ -1089,6 +1094,10 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
|
|||
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
|
||||
struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
|
||||
const char *mod;
|
||||
BOOL pshader = shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type);
|
||||
|
||||
/* D3D vertex shader sampler IDs are vertex samplers(0-3), not global d3d samplers */
|
||||
if(!pshader) sampler_idx += MAX_FRAGMENT_SAMPLERS;
|
||||
|
||||
switch(sampler_type) {
|
||||
case WINED3DSTT_1D:
|
||||
|
@ -1130,6 +1139,12 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
|
|||
if(ins->dst[0].modifiers & WINED3DSPDM_SATURATE) mod = "_SAT";
|
||||
else mod = "";
|
||||
|
||||
/* Fragment samplers always have indentity mapping */
|
||||
if(sampler_idx >= MAX_FRAGMENT_SAMPLERS)
|
||||
{
|
||||
sampler_idx = priv->cur_vs_args->vertex_samplers[sampler_idx - MAX_FRAGMENT_SAMPLERS];
|
||||
}
|
||||
|
||||
if (flags & TEX_DERIV)
|
||||
{
|
||||
if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivates\n");
|
||||
|
@ -1160,7 +1175,7 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
|
|||
shader_addline(buffer, "TEX%s %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg, sampler_idx, tex_type);
|
||||
}
|
||||
|
||||
if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
|
||||
if (pshader)
|
||||
{
|
||||
gen_color_correction(buffer, dst_str, ins->dst[0].write_mask,
|
||||
"one", "coefmul.x", priv->cur_ps_args->super.color_fixup[sampler_idx]);
|
||||
|
@ -3556,6 +3571,7 @@ static inline BOOL vs_args_equal(const struct arb_vs_compile_args *stored, const
|
|||
if(stored->super.fog_src != new->super.fog_src) return FALSE;
|
||||
if(stored->bools != new->bools) return FALSE;
|
||||
if(stored->ps_signature != new->ps_signature) return FALSE;
|
||||
if(stored->vertex_samplers_compare != new->vertex_samplers_compare) return FALSE;
|
||||
if(skip_int) return TRUE;
|
||||
|
||||
return memcmp(stored->loop_ctrl, new->loop_ctrl, sizeof(stored->loop_ctrl)) == 0;
|
||||
|
@ -3665,7 +3681,8 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW
|
|||
{
|
||||
int i;
|
||||
WORD int_skip;
|
||||
const WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info;
|
||||
IWineD3DDeviceImpl *dev = (IWineD3DDeviceImpl *)shader->baseShader.device;
|
||||
const WineD3D_GL_Info *gl_info = &dev->adapter->gl_info;
|
||||
find_vs_compile_args(shader, stateblock, &args->super);
|
||||
|
||||
/* This forces all local boolean constants to 1 to make them stateblock independent */
|
||||
|
@ -3685,6 +3702,11 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW
|
|||
if(stateblock->vertexShaderConstantB[i]) args->bools |= ( 1 << i);
|
||||
}
|
||||
|
||||
args->vertex_samplers[0] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 0];
|
||||
args->vertex_samplers[1] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 1];
|
||||
args->vertex_samplers[2] = dev->texUnitMap[MAX_FRAGMENT_SAMPLERS + 2];
|
||||
args->vertex_samplers[3] = 0;
|
||||
|
||||
/* Skip if unused or local */
|
||||
int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts;
|
||||
if(int_skip == 0xffff || GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION))
|
||||
|
|
Loading…
Reference in a new issue