Am Monday 20 July 2009 20:33:44 schrieb Henri Verbeet:
While in principle this is right, as many functions are indeed very similar, this won't be pretty practically, even excluding that some instructions really need special treatment.
One more thing comes to my mind here: The assembler doesn't actually check if the registers for the instruction are valid. You can happily assemble a shader that doesn't make sense, but validation fails. The validation is implemented in d3d9.dll.Direct3DShaderValidatorCreate9, not in the assembler:
For example: vs_2_0 rep c0 endrep mov oPos, c0
$ vsa.exe shader.txt /Fh shader.h (with native d3d9) Microsoft (R) D3DX9 Shader Assembler 9.25 PRIVATE Copyright (C) Microsoft Corporation 2002-2003. All rights reserved.
Z:\dev\shm\shader.txt(2,1): error X5936: rep requires first parameter to be integer constant register (i#).
assembly failed; no code produced
$ vsa.exe shader.txt /Fh shader.h (with builtin d3d9) Microsoft (R) D3DX9 Shader Assembler 9.25 PRIVATE Copyright (C) Microsoft Corporation 2002-2003. All rights reserved.
fixme:d3d9:Direct3DShaderValidatorCreate9 stub assembly succeeded; see shader.h
So while its certainly nice to print a warning if such a thing happens, the assembler doesn't have to catch it, and must not return an error. Its certainly worth testing if this holds true in d3dx9 though, since vsa.exe seems to have its own copy of the assembler.
As I said to Matteo in an IRC conversion, my main intentions for the one-callback-per-instruction setup when I wrote it last year were this sort of error handling(which I later found out doesn't happen in the assembler), and to map all shader versions to a shared format, and then generate any target shader version(ie, convert between two shader versions), which is now moot as well since we put the shader into d3dx9 and strictly stick to the MS API that way.