GUI: DirectX 11 render backend, part 3
This commit is contained in:
parent
686a684490
commit
852f61b7fc
|
@ -28,6 +28,19 @@ const D3D_FEATURE_LEVEL possibleFeatureLevels[2]={
|
||||||
D3D_FEATURE_LEVEL_10_0
|
D3D_FEATURE_LEVEL_10_0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FurnaceDXTexture {
|
||||||
|
ID3D11Texture2D* tex;
|
||||||
|
ID3D11ShaderResourceView* view;
|
||||||
|
int width, height;
|
||||||
|
unsigned char* lockedData;
|
||||||
|
FurnaceDXTexture():
|
||||||
|
tex(NULL),
|
||||||
|
view(NULL),
|
||||||
|
width(0),
|
||||||
|
height(0),
|
||||||
|
lockedData(NULL) {}
|
||||||
|
};
|
||||||
|
|
||||||
bool FurnaceGUIRenderDX11::destroyRenderTarget() {
|
bool FurnaceGUIRenderDX11::destroyRenderTarget() {
|
||||||
if (renderTarget!=NULL) {
|
if (renderTarget!=NULL) {
|
||||||
renderTarget->Release();
|
renderTarget->Release();
|
||||||
|
@ -83,27 +96,104 @@ bool FurnaceGUIRenderDX11::createRenderTarget() {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImTextureID FurnaceGUIRenderDX11::getTextureID(void* which) {
|
ImTextureID FurnaceGUIRenderDX11::getTextureID(void* which) {
|
||||||
return NULL;
|
FurnaceDXTexture* t=(FurnaceDXTexture*)which;
|
||||||
|
return (ImTextureID)t->view;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FurnaceGUIRenderDX11::lockTexture(void* which, void** data, int* pitch) {
|
bool FurnaceGUIRenderDX11::lockTexture(void* which, void** data, int* pitch) {
|
||||||
|
FurnaceDXTexture* t=(FurnaceDXTexture*)which;
|
||||||
|
if (t->lockedData!=NULL) return false;
|
||||||
|
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mappedRes;
|
||||||
|
memset(&mappedRes,0,sizeof(mappedRes));
|
||||||
|
|
||||||
|
HRESULT result=context->Map(t->tex,D3D11CalcSubresource(0,0,1),D3D11_MAP_WRITE,0,&mappedRes);
|
||||||
|
if (result!=S_OK) {
|
||||||
|
logW("could not map texture!");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
t->lockedData=(unsigned char*)mappedRes.pData;
|
||||||
|
*data=mappedRes.pData;
|
||||||
|
*pitch=mappedRes.RowPitch;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FurnaceGUIRenderDX11::unlockTexture(void* which) {
|
bool FurnaceGUIRenderDX11::unlockTexture(void* which) {
|
||||||
return false;
|
FurnaceDXTexture* t=(FurnaceDXTexture*)which;
|
||||||
|
if (t->lockedData==NULL) return false;
|
||||||
|
context->Unmap(t->tex,D3D11CalcSubresource(0,0,1));
|
||||||
|
t->lockedData=NULL;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FurnaceGUIRenderDX11::updateTexture(void* which, void* data, int pitch) {
|
bool FurnaceGUIRenderDX11::updateTexture(void* which, void* data, int pitch) {
|
||||||
return false;
|
FurnaceDXTexture* t=(FurnaceDXTexture*)which;
|
||||||
|
context->UpdateSubresource(t->tex,D3D11CalcSubresource(0,0,1),NULL,data,pitch,pitch*t->height);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* FurnaceGUIRenderDX11::createTexture(bool dynamic, int width, int height) {
|
void* FurnaceGUIRenderDX11::createTexture(bool dynamic, int width, int height) {
|
||||||
|
D3D11_TEXTURE2D_DESC texDesc;
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
|
||||||
|
ID3D11Texture2D* tex=NULL;
|
||||||
|
ID3D11ShaderResourceView* view=NULL;
|
||||||
|
HRESULT result;
|
||||||
|
|
||||||
|
memset(&texDesc,0,sizeof(texDesc));
|
||||||
|
memset(&viewDesc,0,sizeof(viewDesc));
|
||||||
|
|
||||||
|
texDesc.Width=width;
|
||||||
|
texDesc.Height=height;
|
||||||
|
texDesc.MipLevels=1;
|
||||||
|
texDesc.ArraySize=1;
|
||||||
|
texDesc.Format=DXGI_FORMAT_R8G8B8A8_UNORM; // ???
|
||||||
|
texDesc.SampleDesc.Count=1;
|
||||||
|
texDesc.SampleDesc.Quality=0;
|
||||||
|
texDesc.Usage=dynamic?D3D11_USAGE_DYNAMIC:D3D11_USAGE_DEFAULT;
|
||||||
|
texDesc.BindFlags=D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
texDesc.CPUAccessFlags=dynamic?D3D11_CPU_ACCESS_WRITE:0;
|
||||||
|
texDesc.MiscFlags=0;
|
||||||
|
|
||||||
|
result=device->CreateTexture2D(&texDesc,NULL,&tex);
|
||||||
|
if (result!=S_OK) {
|
||||||
|
logW("could not create texture! %.8x",result);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
viewDesc.Format=texDesc.Format=texDesc.Format;
|
||||||
|
viewDesc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||||
|
viewDesc.Texture2D.MostDetailedMip=0;
|
||||||
|
viewDesc.Texture2D.MipLevels=texDesc.MipLevels;
|
||||||
|
|
||||||
|
result=device->CreateShaderResourceView(tex,&viewDesc,&view);
|
||||||
|
if (result!=S_OK) {
|
||||||
|
logW("could not create texture view! %.8x",result);
|
||||||
|
tex->Release();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
FurnaceDXTexture* ret=new FurnaceDXTexture;
|
||||||
|
ret->width=width;
|
||||||
|
ret->height=height;
|
||||||
|
ret->tex=tex;
|
||||||
|
ret->view=view;
|
||||||
|
textures.push_back(ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FurnaceGUIRenderDX11::destroyTexture(void* which) {
|
bool FurnaceGUIRenderDX11::destroyTexture(void* which) {
|
||||||
return false;
|
FurnaceDXTexture* t=(FurnaceDXTexture*)which;
|
||||||
|
t->view->Release();
|
||||||
|
t->tex->Release();
|
||||||
|
delete t;
|
||||||
|
|
||||||
|
for (size_t i=0; i<textures.size(); i++) {
|
||||||
|
if (textures[i]==t) {
|
||||||
|
textures.erase(textures.begin()+i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUIRenderDX11::setTextureBlendMode(void* which, FurnaceGUIBlendMode mode) {
|
void FurnaceGUIRenderDX11::setTextureBlendMode(void* which, FurnaceGUIBlendMode mode) {
|
||||||
|
@ -115,9 +205,6 @@ void FurnaceGUIRenderDX11::setBlendMode(FurnaceGUIBlendMode mode) {
|
||||||
void FurnaceGUIRenderDX11::resized(const SDL_Event& ev) {
|
void FurnaceGUIRenderDX11::resized(const SDL_Event& ev) {
|
||||||
destroyRenderTarget();
|
destroyRenderTarget();
|
||||||
swapchain->ResizeBuffers(0,0,0,DXGI_FORMAT_UNKNOWN,0);
|
swapchain->ResizeBuffers(0,0,0,DXGI_FORMAT_UNKNOWN,0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
createRenderTarget();
|
createRenderTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,6 +306,13 @@ void FurnaceGUIRenderDX11::initGUI(SDL_Window* win) {
|
||||||
bool FurnaceGUIRenderDX11::quit() {
|
bool FurnaceGUIRenderDX11::quit() {
|
||||||
destroyRenderTarget();
|
destroyRenderTarget();
|
||||||
|
|
||||||
|
for (FurnaceDXTexture* i: textures) {
|
||||||
|
i->view->Release();
|
||||||
|
i->tex->Release();
|
||||||
|
delete i;
|
||||||
|
}
|
||||||
|
textures.clear();
|
||||||
|
|
||||||
if (swapchain!=NULL) {
|
if (swapchain!=NULL) {
|
||||||
swapchain->Release();
|
swapchain->Release();
|
||||||
swapchain=NULL;
|
swapchain=NULL;
|
||||||
|
|
|
@ -26,6 +26,8 @@ typedef void ID3D11RenderTargetView;
|
||||||
typedef void IDXGISwapChain;
|
typedef void IDXGISwapChain;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct FurnaceDXTexture;
|
||||||
|
|
||||||
class FurnaceGUIRenderDX11: public FurnaceGUIRender {
|
class FurnaceGUIRenderDX11: public FurnaceGUIRender {
|
||||||
ID3D11Device* device;
|
ID3D11Device* device;
|
||||||
ID3D11DeviceContext* context;
|
ID3D11DeviceContext* context;
|
||||||
|
@ -37,6 +39,8 @@ class FurnaceGUIRenderDX11: public FurnaceGUIRender {
|
||||||
bool destroyRenderTarget();
|
bool destroyRenderTarget();
|
||||||
bool createRenderTarget();
|
bool createRenderTarget();
|
||||||
|
|
||||||
|
std::vector<FurnaceDXTexture*> textures;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ImTextureID getTextureID(void* which);
|
ImTextureID getTextureID(void* which);
|
||||||
bool lockTexture(void* which, void** data, int* pitch);
|
bool lockTexture(void* which, void** data, int* pitch);
|
||||||
|
|
Loading…
Reference in a new issue