Turns out that the vertex shaders in the Radeon X1000 series GPUs don't support a notable Shader Model 3.0 feature: vertex texture fetch. This question came up in the late stages of writing my Radeon X1000 series review, and I just got confirmation from ATI yesterday. Radeon X1000 series lacks vertex texture fetchīy Scott Wasson - 12:06 pm, October 6, 2005 The point here is that ATI has claimed to do Shader Model 3.0 "right," and from what we have seen today, maybe it isn't so "right" at all. This may not be such a big deal if this particular 3D feature is never exploited until the next generation of video cards. Isn’t the point of standards and Shader Model 3.0 to allow game content developers and programmers a standard API among graphics cards to make their job a little easier? However this does put more work on the shoulders of the game content developer instead of exploiting an easy Shader Model 3.0 feature in their code. It does appear that a workaround is possible. So where does that leave ATI? Have they really done Shader Model 3.0 right or not? How can you claim to do Shader Model 3.0 right and then leave out a feature of the specification? The GeForce 6 and 7 series from NVIDIA supports this feature.
However, the case here is that ATI is claiming they have done Shader Model 3.0 "right," yet they are missing an official Shader Model 3.0 feature. Now, this 3D effect itself may not be currently used in current games, and in fact may not even be used until the next generation of DX10 video cards. There are certain 3D effects which can benefit from this ability such as true dynamic displacement mapping. However, with some recent news that has come to light we wonder if this slogan is really correct.Īccording to The Tech Report, the Radeon X1000 series lack a Vertex Shader 3.0 feature called "Vertex Texture Fetching." Vertex Texture Fetching is useful when you need a vertex shader to read from texture memory. (Which we still have not seen for sale without delayed delivery.) ATI proclaims that they have done Shader Model 3.0 "right" by improving dynamic branching performance and turning batches of pixels into threads. Populating this database generally requires trial-and-error and a lot of different hardware configurations, so can be difficult for the lone developer to do, unfortunately.ATI has been selling the "Shader Model 3.0 Done Right" slogan along with the launch of their Radeon X1000 line of video cards.
What I have done to account for that kind of issue in the past is build up a locally-maintained "feature database" API that allows me to store information about particular card/driver failures and how to fall back to safe alternative code paths when that hardware/driver combination is present on the end-user's machine. although this will not catch all bugs/failures.
This is much rarer these days than it used to be, but in these cases you can't really trust the hardware or driver anyhow and will have to "do it yourself." One way to do this is to simply try to create something using SM3 and see if it fails. This is because, as you alluded to, it's possible for cards to lie or for there to be driver bugs that effectively render particular hardware/driver combinations "non functional" (or at least broken in a fashion you'd want to work around). You'll note that I said "should be guaranteed" in a few places. Below the 10_0 level you have some odd 10Level9 differences to take into account - the upshot for you is that you have to use odd shader model designations like vs_4_0_level_9_1 in some (perhaps all, we're getting into territory I haven't explored much in practice) scenarios. If you're using the 10_0 feature level or greater, you should be guaranteed SM4.
For D3D11 (which I'd recommend over 10, since it should be the case that you can use 11 if you can use 10) device capabilities are categorized into feature levels. All four are described on the linked documentation page.įor D3D10 you should be guaranteed SM4. Of interest to you concerning this problem will the fields in the resulting structure called VertexShaderVersion and PixelShaderVersion as well as possibly MaxVertexShader30InstructionSlots and MaxPixelShader30InstructionSlots. This will give you a structure containing a lot of interesting information about what the hardware supports. If you are using D3D9, you can query for device capabilities reported by your card using the IDirect3D9::GetDeviceCaps method.