Sign in to follow this  
_Flame_

DX11 DX11 software mode.

Recommended Posts

Hi.
Is it possible to run DX11 application in software mode on Win7? I've tried but i've had an error "incorrect parameter". I know that i need to put handle of module as one of parameters and i did it but it's not a handle where a window is. Is it ok? Could anyone help me? Maybe anyone has an example? Thanks.

Share this post


Link to post
Share on other sites
For software mode you're supposed to provide a handle to a DLL that implements a D3D11 driver + rasterizer in software. If you don't have one, you can't use it.

There is a built-in software rasterizer, called [url="http://msdn.microsoft.com/en-us/library/gg615082.aspx"]WARP[/url]. To you use it you pass D3D_DRIVER_TYPE_WARP when creating the device.

Share this post


Link to post
Share on other sites
Thanks for answer. So as i understand correctly i need to provide a handle of my main application but not a handle of dll where my engine is? And after that it will work in software mode well? Ok, i will try. Just another question. What's the difference between software and reference mode? And what do you mean "built-in software rasterizer, called WARP". I've heard a little bit about that mode and i've thought that it's software mode which works a little bit faster when usual software mode and i don't know why. But the problem is that only DX10.1 is available on Win7 with that mode and it's not suitable for me.

Share this post


Link to post
Share on other sites
[quote name='_Flame_' timestamp='1342070397' post='4958258']
But the problem is that only DX10.1 is available on Win7 with that mode and it's not suitable for me.
[/quote]
I'm not sure where you heard that, but you heard wrong. Full D3D11 is available on Windows 7. Even if you have downlevel hardware you can still use feature levels to target it with the D3D11 API - http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx

Share this post


Link to post
Share on other sites
It's me again but under abit different nickname coz i don't have pass here from my original nickname [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]

I've read about those limitations here - [url="http://msdn.microsoft.com/en-us/library/windows/desktop/ff476328%28v=vs.85%29.aspx"]http://msdn.microsof...8(v=vs.85).aspx[/url]

[quote]A WARP driver, which is a high-performance software rasterizer. The rasterizer supports feature levels 9_1 through level 10_1 with a high performance software implementation
[b]Note[/b] The WARP driver that Windows 8 includes supports feature levels 9_1 through level 11_1.[/quote]

But anyway i'm not successfull in the any software modes now. My app is .net. And i do such thing - GetModuleHandle("MayApp.vcshost.exe"); and this function retuns handle which isn't null but i again have error - "Incorrect parameter" in the function [font=monospace]D3D11CreateDivice. [/font]What's wrong? Edited by _Flame1_

Share this post


Link to post
Share on other sites
The handle is expected to be that of a native module (commonly a dll), which implements and exports the D3D driver entrypoints (there are lot of them).

All the stuff you need to implement is listed in the Windows DDK under the graphics drivers section. The basics of implementing a software driver are almost exactly same as implementing the user-mode portion of a hardware driver, though direct kernel access is not strictly necessary in pure software. In addition, software driver necessarily needs to implement the actual drawing operations such as the whole graphics pipeline, which would otherwise reside on GPU hardware.

I am under the impression that D3D 11.1 will be released on Vista and 7 as well, after '8' launches. This would enable you to use the WARP driver with 11.0 feature set. Edited by Nik02

Share this post


Link to post
Share on other sites
Very funny Nik02. I need to implement a software driver for that.

[quote]A reference driver, which is a software implementation that supports every Direct3D feature. A reference driver is designed for accuracy rather than speed and as a result is slow but accurate. The rasterizer portion of the driver does make use of special CPU instructions whenever it can, but it is not intended for retail applications; use it only for feature testing, demonstration of functionality, debugging, or verifying bugs in other drivers. This driver is installed by the DirectX SDK. This driver may be referred to as a REF driver, a reference driver or a reference rasterizer.[/quote]

Where can i get that driver? [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]
I see that DX runtime has D3D11Ref.dll. What's that? Edited by _Flame1_

Share this post


Link to post
Share on other sites
Guys why are you decreasing my reputation? I just need to use software mode for my application, no more. [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img] Is it problem? Edited by _Flame1_

Share this post


Link to post
Share on other sites
[quote name='_Flame_' timestamp='1342039817' post='4958157']
I know that i need to put handle of module as one of parameters and i did it but it's not a handle where a window is. Is it ok?
[/quote][quote name='MJP' timestamp='1342041509' post='4958168']
For software mode you're supposed to provide a handle to a DLL that implements a D3D11 driver + rasterizer in software. If you don't have one, you can't use it.
[/quote][quote name='_Flame_' timestamp='1342070397' post='4958258']
So as i understand correctly i need to provide a handle of my main application but not a handle of dll where my engine is?
I do such thing - GetModuleHandle("MayApp.vcshost.exe"); and this function retuns handle which isn't null but i again have error - "Incorrect parameter" in the function D3D11CreateDivice. What's wrong?
[/quote][quote name='Nik02' timestamp='1342096354' post='4958374']
The handle is expected to be that of a native module (commonly a dll), which implements and exports the D3D driver entrypoints (there are lot of them).
[/quote][quote name='_Flame1_' timestamp='1342100958' post='4958397']
Very funny Nik02. I need to implement a software driver for that.
[/quote]You asked about your incorrect use of the handle parameter... MJP told you that this parameter is supposed to be used to load a custom D3D Driver DLL ([i]and tried to steer you away from this and onto the WARP software driver[/i])... You ignored him and kept trying to pass a handle to your application as if it were a software D3D driver... Nik02 again explained that the handle is for a driver DLL, and if you want to use it, you must implement this DLL yourself... and then you treat his reply as a joke, and tell him what they both told you already?? I dont understand how you're simultaneously understanding their advice and ignoring their advice!

You can either
* load a software driver DLL (which you can write yourself, in theory...),
* use WARP with it's feature level restrictions, or
* use the reference device, although it's supposed to only be used for debugging purposes. Edited by Hodgman

Share this post


Link to post
Share on other sites
Dear Hodgman i don't know this topic and it's easy for me not to understand correctly. They said that i need to put a handle where driver is. But i thought that it's in my application. Ok. it was a mistake, now i've got it. I've ask some example or maybe small piece of code. Advice about implementing a driver is really joke for me. [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img] I didn't ask that at all. All i need is to run my application in software mode. What should i do for that? I don't need abstract advice i need practical. [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]

[quote]
You can either
* load a software driver DLL (which you can write yourself, in theory...),
* use WARP with it's feature level restrictions, or
* use the reference device, although it's supposed to only be used for debugging purposes.
[/quote]

1. I can't do the first one.
2. How?
3. How?

What the hell should i do for 2 and 3 options? Edited by _Flame1_

Share this post


Link to post
Share on other sites
For WARP you just specify D3D_DRIVER_TYPE_WARP in your D3D11CreateDeviceAndSwapChain call. That's all documented in the SDK.

As I flagged above, be very very certain that you do in fact need a software device before jumping in and creating one. You indicated that your understanding was that Windows 7 doesn't support D3D11 but that understanding is wrong. Even if you do need to run a program on downlevel (i.e. D3D9 or 10 class) hardware you can still do so via feature levels - check the link I provided above.

So it's likely that you don't in fact need a software device at all.

Share this post


Link to post
Share on other sites
[quote]For WARP you just specify D3D_DRIVER_TYPE_WARP in your D3D11CreateDeviceAndSwapChain call. That's all documented in the SDK.[/quote]
I use D3D11CreateDevice and this flag doesn't work for me. I've tried all software flags(ref, warp and soft) and no one works. I've got an error "incorrect parameter".

[quote]As I flagged above, be very very certain that you do in fact need a software device before jumping in and creating one. You indicated that your understanding was that Windows 7 doesn't support D3D11 but that understanding is wrong. Even if you do need to run a program on downlevel (i.e. D3D9 or 10 class) hardware you can still do so via feature levels - check the link I provided above.[/quote]
No, you didn't understand me. I wrote that WARP doesn't have DX11 if i correctly understand msdn.

Share this post


Link to post
Share on other sites
What are the exact features present in the 11.0 profile that you can't live without?

Functionality equivalent to tessellation and compute shaders is fairly trivial to implement in software, even though the rest of the drawing would happen in actual GPU hardware (even legacy GPUs). Of course, software is always going to be slower at these, and neither WARP nor your theoretical custom sw driver won't change that.

And, as I said previously, the newest version of WARP does support the D3D11 feature set. You just have to wait until the 11.1 runtime is released later this year. If you can't really wait, the only way is to write your own driver - which couldn't be farther from trivial, but is possible for an experienced software engineer team with a lot of time on their hands. Writing the driver from scratch very likely takes more time than waiting for the new WARP driver, though; no matter how experienced the team is. Edited by Nik02

Share this post


Link to post
Share on other sites
Nick02 why are you teaching me what i need and what i don't need. I've already said what i need. If it's impossible now then ok i will cope with it. I don't care about performance at all. The only thing that i need is DX11 software mode to run my app without appropriate hardware, no more.

Share this post


Link to post
Share on other sites
The thing is, you've already been told that you can run your app without appropriate hardware.

You don't need a software mode for this.
You can still use the D3D11 API.

Just use [url="http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx"]feature levels[/url] and it will work. If you must, you can go so far as to specify D3D_FEATURE_LEVEL_9_1 and it will even work on ancient D3D9 class hardware. So unless there are specific features that only D3D11 has and that you must use, which was Nick02's question, you already have an appropriate solution that does not require a software mode.

Share this post


Link to post
Share on other sites
mhagain. I know that i can use DX11 with profiles. It's not a secrect for me. I need a software mode with full featured DX11 profile. Again, you advice me that i don't need. It seem to me that this discussion is useless for me. It's better to close that topic if it goes that way. For some reason you just like decreasing reputation instead of real help.

Share this post


Link to post
Share on other sites
We tried to be helpful and offer alternative ways to proceed, but it seems that the effort was wasted.

I know that MJP, mhagain and Hodgman are experienced software developers as well as helpful guys in general; we generally know what we're doing and we try to reply with our best knowledge. Usually, if you hit a dead end, the wise way to proceed is to find alternative ways. We presented several such ways, all of which are viable (though with hugely varying amount of effort required) but you insist on clawing your way through the thick brick wall that blocks your path.

If we had more accurate information about the scenario you actually want to accomplish, we would be able to offer more accurate help. But, personally, I don't have any incentive left to do that. I'll just concentrate on helping those that appreciate the effort.

Bye,
-N

Share this post


Link to post
Share on other sites
[quote name='_Flame_' timestamp='1342207571' post='4958880']
I don't care about performance at all. The only thing that i need is DX11 software mode to run my app without appropriate hardware, no more.
[/quote]

D3D_DRIVER_TYPE_REFERENCE is exactly that, as others have already suggested. It has all full D3D11 features.

Share this post


Link to post
Share on other sites
Flame, do you have the DirectX SDK installed? Debug, Reference [s]and WARP[/s] drivers are [i]only[/i] available from the SDK - since they are supposed to be debug tools. Edited by Bacterius

Share this post


Link to post
Share on other sites
[quote name='MJP' timestamp='1342402740' post='4959413']
WARP isn't a debugging tool, it's intended to be deployed. So I'm pretty sure you don't need to install the SDK to use it.
[/quote]
Indeed [url="http://msdn.microsoft.com/en-us/library/windows/desktop/gg615082%28v=vs.85%29.aspx#how_to_use_warp"]it is part of the D3D runtime[/url] - my mistake. Thanks MJP.

Share this post


Link to post
Share on other sites
Yes. It's not good if it will be nessesary to install DirectX SDK but it's alright.
Ok, here is my code.

[code]D3D_DRIVER_TYPE driver = D3D_DRIVER_TYPE_REFERENCE;
D3D11CreateDevice(pAdapter, driver, 0, 0, 0, 0, D3D11_SDK_VERSION, &pDevice, NULL, NULL );[/code]

Also i've tried D3D_DRIVER_TYPE_WARP. And i have HRESULT - 0x80070057(The parameter is incorrect. ) all time.
Yes, i have installed latest DirectX Sdk.

Share this post


Link to post
Share on other sites
Maybe you need the other 2 [font=courier new,courier,monospace]out[/font] params to not be [font=courier new,courier,monospace]NULL[/font]?[code]D3D_FEATURE_LEVEL level = 0;
ID3D11DeviceContext* pContext = 0;
D3D_DRIVER_TYPE driver = D3D_DRIVER_TYPE_REFERENCE;
D3D11CreateDevice(pAdapter, driver, 0, 0, 0, 0, D3D11_SDK_VERSION, &pDevice, &level, &pContext );[/code]
[Edit] Also, did you see this restriction? It implies that [font=courier new,courier,monospace]pAdapter[/font] should be [font=courier new,courier,monospace]NULL[/font] for a reference driver.
[quote]If you set the pAdapter parameter to a non-NULL value, you must also set the DriverType parameter to the D3D_DRIVER_TYPE_UNKNOWN value.[/quote] Edited by Hodgman

Share this post


Link to post
Share on other sites
Thanks. D3D_DRIVER_TYPE_REFERENCE is working now with NULL adapter.

But i can't create swap chain now.
The function CreateSwapChain returns error - 0x887A0001(DXGI_ERROR_INVALID_CALL).


Also i can't run my application with WARP.
[code]D3D_DRIVER_TYPE driver = D3D_DRIVER_TYPE_WARP;
D3D11CreateDevice(0, driver, 0, 0, 0, 0, D3D10_SDK_VERSION, &pDevice, NULL, NULL );[/code]
I have an error "The parameter is incorrect" again. Edited by _Flame1_

Share this post


Link to post
Share on other sites
Any ideas? Firstly i invoke D3D11CreateDevice and secondly IDXGIFactory->CreateSwapChain;

My SwapChainDescription is quite simple.

[code]DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory( &sd, sizeof( sd ) );
sd.BufferCount = 1;
sd.BufferDesc.Width = 640;
sd.BufferDesc.Height = 480;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = g_hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;[/code]

I took it from msdn example.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Announcements

  • Forum Statistics

    • Total Topics
      628367
    • Total Posts
      2982284
  • Similar Content

    • By joeblack
      Hi,
      im reading about specular aliasing because of mip maps, as far as i understood it, you need to compute fetched normal lenght and detect now its changed from unit length. I’m currently using BC5 normal maps, so i reconstruct z in shader and therefore my normals are normalized. Can i still somehow use antialiasing or its not needed? Thanks.
    • By 51mon
      I want to change the sampling behaviour to SampleLevel(coord, ddx(coord.y).xx, ddy(coord.y).xx). I was just wondering if it's possible without explicit shader code, e.g. with some flags or so?
    • By GalacticCrew
      Hello,
      I want to improve the performance of my game (engine) and some of your helped me to make a GPU Profiler. After creating the GPU Profiler, I started to measure the time my GPU needs per frame. I refined my GPU time measurements to find my bottleneck.
      Searching the bottleneck
      Rendering a small scene in an Idle state takes around 15.38 ms per frame. 13.54 ms (88.04%) are spent while rendering the scene, 1.57 ms (10.22%) are spent during the SwapChain.Present call (no VSync!) and the rest is spent on other tasks like rendering the UI. I further investigated the scene rendering, since it takes über 88% of my GPU frame rendering time.
      When rendering my scene, most of the time (80.97%) is spent rendering my models. The rest is spent to render the background/skybox, updating animation data, updating pixel shader constant buffer, etc. It wasn't really suprising that most of the time is spent for my models, so I further refined my measurements to find the actual bottleneck.
      In my example scene, I have five animated NPCs. When rendering these NPCs, most actions are almost for free. Setting the proper shaders in the input layout (0.11%), updating vertex shader constant buffers (0.32%), setting textures (0.24%) and setting vertex and index buffers (0.28%). However, the rest of the GPU time (99.05% !!) is spent in two function calls: DrawIndexed and DrawIndexedInstance.
      I searched this forum and the web for other articles and threads about these functions, but I haven't found a lot of useful information. I use SharpDX and .NET Framework 4.5 to develop my game (engine). The developer of SharpDX said, that "The method DrawIndexed in SharpDX is a direct call to DirectX" (Source). DirectX 11 is widely used and SharpDX is "only" a wrapper for DirectX functions, I assume the problem is in my code.
      How I render my scene
      When rendering my scene, I render one model after another. Each model has one or more parts and one or more positions. For example, a human model has parts like head, hands, legs, torso, etc. and may be placed in different locations (on the couch, on a street, ...). For static elements like furniture, houses, etc. I use instancing, because the positions never change at run-time. Dynamic models like humans and monster don't use instancing, because positions change over time.
      When rendering a model, I use this work-flow:
      Set vertex and pixel shaders, if they need to be updated (e.g. PBR shaders, simple shader, depth info shaders, ...) Set animation data as constant buffer in the vertex shader, if the model is animated Set generic vertex shader constant buffer (world matrix, etc.) Render all parts of the model. For each part: Set diffuse, normal, specular and emissive texture shader views Set vertex buffer Set index buffer Call DrawIndexedInstanced for instanced models and DrawIndexed models What's the problem
      After my GPU profiling, I know that over 99% of the rendering time for a single model is spent in the DrawIndexedInstanced and DrawIndexed function calls. But why do they take so long? Do I have to try to optimize my vertex or pixel shaders? I do not use other types of shaders at the moment. "Le Comte du Merde-fou" suggested in this post to merge regions of vertices to larger vertex buffers to reduce the number of Draw calls. While this makes sense to me, it does not explain why rendering my five (!) animated models takes that much GPU time. To make sure I don't analyse something I wrong, I made sure to not use the D3D11_CREATE_DEVICE_DEBUG flag and to run as Release version in Visual Studio as suggested by Hodgman in this forum thread.
      My engine does its job. Multi-texturing, animation, soft shadowing, instancing, etc. are all implemented, but I need to reduce the GPU load for performance reasons. Each frame takes less than 3ms CPU time by the way. So the problem is on the GPU side, I believe.
    • By noodleBowl
      I was wondering if someone could explain this to me
      I'm working on using the windows WIC apis to load in textures for DirectX 11. I see that sometimes the WIC Pixel Formats do not directly match a DXGI Format that is used in DirectX. I see that in cases like this the original WIC Pixel Format is converted into a WIC Pixel Format that does directly match a DXGI Format. And doing this conversion is easy, but I do not understand the reason behind 2 of the WIC Pixel Formats that are converted based on Microsoft's guide
      I was wondering if someone could tell me why Microsoft's guide on this topic says that GUID_WICPixelFormat40bppCMYKAlpha should be converted into GUID_WICPixelFormat64bppRGBA and why GUID_WICPixelFormat80bppCMYKAlpha should be converted into GUID_WICPixelFormat64bppRGBA
      In one case I would think that: 
      GUID_WICPixelFormat40bppCMYKAlpha would convert to GUID_WICPixelFormat32bppRGBA and that GUID_WICPixelFormat80bppCMYKAlpha would convert to GUID_WICPixelFormat64bppRGBA, because the black channel (k) values would get readded / "swallowed" into into the CMY channels
      In the second case I would think that:
      GUID_WICPixelFormat40bppCMYKAlpha would convert to GUID_WICPixelFormat64bppRGBA and that GUID_WICPixelFormat80bppCMYKAlpha would convert to GUID_WICPixelFormat128bppRGBA, because the black channel (k) bits would get redistributed amongst the remaining 4 channels (CYMA) and those "new bits" added to those channels would fit in the GUID_WICPixelFormat64bppRGBA and GUID_WICPixelFormat128bppRGBA formats. But also seeing as there is no GUID_WICPixelFormat128bppRGBA format this case is kind of null and void
      I basically do not understand why Microsoft says GUID_WICPixelFormat40bppCMYKAlpha and GUID_WICPixelFormat80bppCMYKAlpha should convert to GUID_WICPixelFormat64bppRGBA in the end
       
    • By DejayHextrix
      Hi, New here. 
      I need some help. My fiance and I like to play this mobile game online that goes by real time. Her and I are always working but when we have free time we like to play this game. We don't always got time throughout the day to Queue Buildings, troops, Upgrades....etc.... 
      I was told to look into DLL Injection and OpenGL/DirectX Hooking. Is this true? Is this what I need to learn? 
      How do I read the Android files, or modify the files, or get the in-game tags/variables for the game I want? 
      Any assistance on this would be most appreciated. I been everywhere and seems no one knows or is to lazy to help me out. It would be nice to have assistance for once. I don't know what I need to learn. 
      So links of topics I need to learn within the comment section would be SOOOOO.....Helpful. Anything to just get me started. 
      Thanks, 
      Dejay Hextrix 
  • Popular Now