wined3d: Another GLSL shader status update
Ivan Gyurdiev
ivg2 at cornell.edu
Sun Jun 4 03:20:31 CDT 2006
+ /* Declare textures samplers */
+ for(i = 0; i < /*This->baseShader.limits.texture */ 4; i++) {
+// if (reg_maps->texcoord & (1 << i))
+ shader_addline(buffer,"uniform sampler2D mytex%lu;\n", i);
+ }
What's the problem here?
+ if (wined3d_settings.shader_mode == SHADER_GLSL)
+ shader_glsl_add_instruction_modifiers(&hw_arg);
If you choose to pull modifier handling out of the per-opcode function,
this should be done for SHADER_ARB as well, imho.
+ for (i=0; i<max_constants; ++i) {
...
- for (i = 0; i <= WINED3D_VSHADER_MAX_CONSTANTS; ++i) {
Is this fixing off-by-one bug in the old code in the process (or
introducing one)?
+ loadConstants(iface, GL_VERTEX_PROGRAM_ARB, constants,
NULL,
+
vshader->baseShader.limits.constant_float, programId, TRUE);
What's the purpose of the "skip_type_check" parameter - TRUE here.
Doesn't the current code only work for float constants anyway?
+ /* Update the constants */
+ loadConstants(iface, GL_FRAGMENT_PROGRAM_ARB,
This->stateBlock->pixelShaderConstantF,
+ This->stateBlock->pixelShaderConstantT,
pshader->baseShader.limits.constant_float,
+ programId, FALSE);
Those limits aren't checked against GL capabilities yet.
The current 3.0 limit is 224 float constants - does this work properly?
+void shader_glsl_add_instruction_modifiers(SHADER_OPCODE_ARG* arg
Doesn't seem to handle multiple modifiers - I think I changed this
elsewhere recently.
+ FIXME("Unrecognized modifier(0x%#lx)\n", mask >>
D3DSP_DSTMOD_SHIFT);
0x and # are redundant.
+ SHADER_PARAM_FCT_T param_fct;
Please don't add any more fields that do not need to persist into base
shader. Why are two different param functions needed?
+extern void shader_glsl_add_cast(
+ int numSwizzles,
+ char *hwLine);
Where is this defined?
+void pshader_glsl_def(SHADER_OPCODE_ARG* arg) {
...
+ shader->constants[reg & 0xFF] = VS_CONSTANT_CONSTANT;
That's not what the ARBfp code does - pixel shaders are different from
vertex shader (and I don't see why, conceptually this is all the same
thing, only the limit is slightly different).
+ /* Set constants for the temporary argument */
I'm not sure I like how the mnxn functions use a temporary argument
structure and re-invoke the gen. functions. Do they initialize every
field necessary in the arg? I might have added new fields and missed the
initialization part in there - maybe this arg should be 0-ed first with
memcpy.
+ GLhandleARB objList[4]; /* There should never be more than 2
objects attached
+ (one pixel shader and one vertex
shader), but we'll be safe */
This doesn't make sense to me - either you know that there are 2 objects
attached exactly, or you don't. In either case, it's wrong to cover up a
potential bug with a 4-element array.
+ * Note: The downside to this method is that we may end up compiling
and linking
+ * programs that will not be used. Linking is expensive, but it's
typically better to
+ * create more programs than necessary and just bind them when needed
than it is
+ * to create a new program every time you set the shaders
+ */
This is an elaborate scheme with linked lists in each shader - is that
really necessary?
I'm very confused after reading the code (but maybe that's just me :)
Maybe a test case would be useful?
If I call:
X = CreatePixelShader(dev);
Y = CreateVertexShader(dev);
Z = CreateVertexShader(dev);
SetPixelShader(dev, X);
SetVertexShader(dev, Y);
SetVertexShader(dev, Z);
How many programs are being created?
What objects are attached to each?
Which linked lists does each program go into, and
What's the sequence of things being attached/detached, programs
created/destroyed?
More information about the wine-devel
mailing list