Am Sonntag 27 August 2006 04:29 schrieb Ivan Gyurdiev:
Stefan Dösinger wrote:
Pre 2.0 pixel shaders do not contain a tag for the texture type to sample from. Wine had 2D textures hardcoded, this patch checks the bound texture type to decide from which texture to sample from. For >= 2.0 shaders the shader tag is still used.
Why can't this be done in a much cleaner way where the sampler is initialized (2nd pass, baseshader, get_registers_used)? Then you don't have to copy and paste the same thing in many places - there's 10 texture instructions or something like that for pixel shaders alone.
Well, I'm pretty new to the shader code, seems like I didn't find the right place for this :-)
If I understand you correctly I should check the texture type from the stateblock around line 300 in baseshader.c:
* Declare 1.X samplers implicitly, based on the destination reg. number */ if (D3DSHADER_VERSION_MAJOR(This->baseShader.hex_version) == 1 && (D3DSIO_TEX == curOpcode->opcode || D3DSIO_TEXBEM == curOpcode->opcode || D3DSIO_TEXM3x2TEX == curOpcode->opcode || D3DSIO_TEXM3x3TEX == curOpcode->opcode)) {
/* Fake sampler usage, only set reserved bit and ttype */ DWORD sampler_code = *pToken & D3DSP_REGNUM_MASK; reg_maps->samplers[sampler_code] = (0x1 << 31) | WINED3DSTT_2D; <--- }
Also, maybe the stateblock should be passed as an argument to all functions that use its states. I don't like walking up the tree to find what you need (this->wineD3Ddevice) - it's a hidden dependency on device state, which isn't even all the time - that's why you had to move the point where the shader is compiled [ this needs better documentation ].
Do you mean adding a pointer to the stateblock in baseShader or copying the entire stateblock? I do not really see any advantage in that, except avoiding the This->wineD3DDevice->stateBlock(would be This->stateBlock instead). I think that is confusing, we should have only one place to access the stateblock(and only one copy of the primary state block)
Similarly, I think the code would be cleaner if projected sampling vs regular was retrieved from the stateblock, and stored somewhere else, at the point when the sampler is initialized.
Do you mean an extra stateblock member for every sampler which stores if projected sampling is used? I do not see any advantage in that, we'd create another redundant copy of the data. a