forked from MoonsideGames/Refresh
CreateTexture, SetTextureData, BindIndexBuffer, BindFragmentSamplers, QueueDestroyTexture, DrawIndexedPrimitives, DrawInstancedPrimitives
parent
21c5ded803
commit
3966614681
|
@ -48,6 +48,46 @@ void Refresh_LogError(const char *fmt, ...);
|
||||||
|
|
||||||
/* Internal Helper Utilities */
|
/* Internal Helper Utilities */
|
||||||
|
|
||||||
|
static inline int32_t Texture_GetBlockSize(
|
||||||
|
Refresh_TextureFormat format
|
||||||
|
) {
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case REFRESH_TEXTUREFORMAT_BC1:
|
||||||
|
case REFRESH_TEXTUREFORMAT_BC2:
|
||||||
|
case REFRESH_TEXTUREFORMAT_BC3:
|
||||||
|
case REFRESH_TEXTUREFORMAT_BC7:
|
||||||
|
return 4;
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R5G6B5:
|
||||||
|
case REFRESH_TEXTUREFORMAT_B4G4R4A4:
|
||||||
|
case REFRESH_TEXTUREFORMAT_A1R5G5B5:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16_SFLOAT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8G8_SNORM:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8G8_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8G8B8A8:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R32_SFLOAT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM:
|
||||||
|
case REFRESH_TEXTUREFORMAT_A2R10G10B10:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16G16_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16G16B16A16:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT:
|
||||||
|
return 1;
|
||||||
|
default:
|
||||||
|
Refresh_LogError(
|
||||||
|
"Unrecognized TextureFormat!"
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint32_t Texture_GetFormatSize(
|
static inline uint32_t Texture_GetFormatSize(
|
||||||
Refresh_TextureFormat format
|
Refresh_TextureFormat format
|
||||||
) {
|
) {
|
||||||
|
@ -87,7 +127,7 @@ static inline uint32_t Texture_GetFormatSize(
|
||||||
return 16;
|
return 16;
|
||||||
default:
|
default:
|
||||||
Refresh_LogError(
|
Refresh_LogError(
|
||||||
"Unrecognized SurfaceFormat!"
|
"Unrecognized TextureFormat!"
|
||||||
);
|
);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,6 +153,14 @@ static DXGI_FORMAT RefreshToD3D11_VertexFormat[] =
|
||||||
DXGI_FORMAT_R16G16B16A16_FLOAT /* HALFVECTOR4 */
|
DXGI_FORMAT_R16G16B16A16_FLOAT /* HALFVECTOR4 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint32_t RefreshToD3D11_SampleCount[] =
|
||||||
|
{
|
||||||
|
1, /* REFRESH_SAMPLECOUNT_1 */
|
||||||
|
2, /* REFRESH_SAMPLECOUNT_2 */
|
||||||
|
4, /* REFRESH_SAMPLECOUNT_4 */
|
||||||
|
8 /* REFRESH_SAMPLECOUNT_8 */
|
||||||
|
};
|
||||||
|
|
||||||
static DXGI_FORMAT RefreshToD3D11_IndexType[] =
|
static DXGI_FORMAT RefreshToD3D11_IndexType[] =
|
||||||
{
|
{
|
||||||
DXGI_FORMAT_R16_UINT, /* 16BIT */
|
DXGI_FORMAT_R16_UINT, /* 16BIT */
|
||||||
|
@ -338,25 +346,15 @@ typedef struct D3D11Texture
|
||||||
/* D3D Handles */
|
/* D3D Handles */
|
||||||
ID3D11Resource *handle; /* ID3D11Texture2D* or ID3D11Texture3D* */
|
ID3D11Resource *handle; /* ID3D11Texture2D* or ID3D11Texture3D* */
|
||||||
ID3D11ShaderResourceView *shaderView;
|
ID3D11ShaderResourceView *shaderView;
|
||||||
|
ID3D11View *targetView; /* ID3D11RenderTargetView* or ID3D11DepthStencilView* */
|
||||||
|
|
||||||
/* Basic Info */
|
/* Basic Info */
|
||||||
uint32_t levelCount;
|
Refresh_TextureFormat format;
|
||||||
uint8_t isRenderTarget;
|
|
||||||
|
|
||||||
/* Dimensions*/
|
|
||||||
#define REFRESH_D3D11_RENDERTARGET_2D 0
|
|
||||||
#define REFRESH_D3D11_RENDERTARGET_3D 1
|
|
||||||
#define REFRESH_D3D11_RENDERTARGET_CUBE 2
|
|
||||||
uint8_t rtType;
|
|
||||||
REFRESHNAMELESS union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
ID3D11View *targetView; /* ID3D11RenderTargetView* or ID3D11DepthStencilView* */
|
uint32_t depth;
|
||||||
} twod;
|
uint32_t levelCount;
|
||||||
};
|
uint8_t isCube;
|
||||||
} D3D11Texture;
|
} D3D11Texture;
|
||||||
|
|
||||||
typedef struct D3D11SwapchainData
|
typedef struct D3D11SwapchainData
|
||||||
|
@ -400,8 +398,10 @@ typedef struct D3D11GraphicsPipeline
|
||||||
ID3D11VertexShader *vertexShader;
|
ID3D11VertexShader *vertexShader;
|
||||||
ID3D11InputLayout *inputLayout;
|
ID3D11InputLayout *inputLayout;
|
||||||
uint32_t *vertexStrides;
|
uint32_t *vertexStrides;
|
||||||
|
uint32_t numVertexSamplers;
|
||||||
|
|
||||||
ID3D11PixelShader *fragmentShader;
|
ID3D11PixelShader *fragmentShader;
|
||||||
|
uint32_t numFragmentSamplers;
|
||||||
} D3D11GraphicsPipeline;
|
} D3D11GraphicsPipeline;
|
||||||
|
|
||||||
typedef struct D3D11CommandBuffer
|
typedef struct D3D11CommandBuffer
|
||||||
|
@ -524,6 +524,16 @@ static void D3D11_INTERNAL_LogError(
|
||||||
Refresh_LogError("%s! Error Code: %s (0x%08X)", msg, wszMsgBuff, res);
|
Refresh_LogError("%s! Error Code: %s (0x%08X)", msg, wszMsgBuff, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Subresources */
|
||||||
|
|
||||||
|
static inline uint32_t D3D11_INTERNAL_CalcSubresource(
|
||||||
|
uint32_t mipLevel,
|
||||||
|
uint32_t arraySlice,
|
||||||
|
uint32_t numLevels
|
||||||
|
) {
|
||||||
|
return mipLevel + (arraySlice * numLevels);
|
||||||
|
}
|
||||||
|
|
||||||
/* Quit */
|
/* Quit */
|
||||||
|
|
||||||
static void D3D11_DestroyDevice(
|
static void D3D11_DestroyDevice(
|
||||||
|
@ -590,7 +600,18 @@ static void D3D11_DrawInstancedPrimitives(
|
||||||
uint32_t vertexParamOffset,
|
uint32_t vertexParamOffset,
|
||||||
uint32_t fragmentParamOffset
|
uint32_t fragmentParamOffset
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||||
|
|
||||||
|
ID3D11DeviceContext_DrawIndexedInstanced(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
PrimitiveVerts(d3d11CommandBuffer->graphicsPipeline->primitiveType, primitiveCount),
|
||||||
|
instanceCount,
|
||||||
|
startIndex,
|
||||||
|
baseVertex,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
/* FIXME: vertex/fragment param offsets */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_DrawIndexedPrimitives(
|
static void D3D11_DrawIndexedPrimitives(
|
||||||
|
@ -602,7 +623,16 @@ static void D3D11_DrawIndexedPrimitives(
|
||||||
uint32_t vertexParamOffset,
|
uint32_t vertexParamOffset,
|
||||||
uint32_t fragmentParamOffset
|
uint32_t fragmentParamOffset
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11_DrawInstancedPrimitives(
|
||||||
|
driverData,
|
||||||
|
commandBuffer,
|
||||||
|
baseVertex,
|
||||||
|
startIndex,
|
||||||
|
primitiveCount,
|
||||||
|
1,
|
||||||
|
vertexParamOffset,
|
||||||
|
fragmentParamOffset
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_DrawPrimitives(
|
static void D3D11_DrawPrimitives(
|
||||||
|
@ -969,6 +999,7 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline(
|
||||||
ERROR_CHECK_RETURN("Could not create vertex shader", NULL);
|
ERROR_CHECK_RETURN("Could not create vertex shader", NULL);
|
||||||
}
|
}
|
||||||
pipeline->vertexShader = (ID3D11VertexShader*) vertShaderModule->shader;
|
pipeline->vertexShader = (ID3D11VertexShader*) vertShaderModule->shader;
|
||||||
|
pipeline->numVertexSamplers = pipelineCreateInfo->vertexShaderInfo.samplerBindingCount;
|
||||||
|
|
||||||
/* Input Layout */
|
/* Input Layout */
|
||||||
|
|
||||||
|
@ -1030,6 +1061,7 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline(
|
||||||
ERROR_CHECK_RETURN("Could not create pixel shader", NULL);
|
ERROR_CHECK_RETURN("Could not create pixel shader", NULL);
|
||||||
}
|
}
|
||||||
pipeline->fragmentShader = (ID3D11PixelShader*) fragShaderModule->shader;
|
pipeline->fragmentShader = (ID3D11PixelShader*) fragShaderModule->shader;
|
||||||
|
pipeline->numFragmentSamplers = pipelineCreateInfo->fragmentShaderInfo.samplerBindingCount;
|
||||||
|
|
||||||
/* FIXME: Need to create uniform buffers for the shaders */
|
/* FIXME: Need to create uniform buffers for the shaders */
|
||||||
|
|
||||||
|
@ -1107,8 +1139,172 @@ static Refresh_Texture* D3D11_CreateTexture(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_TextureCreateInfo *textureCreateInfo
|
Refresh_TextureCreateInfo *textureCreateInfo
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
|
uint8_t isSampler, isCompute, isRenderTarget, isDepthStencil;
|
||||||
|
ID3D11Resource *textureHandle;
|
||||||
|
ID3D11ShaderResourceView *srv = NULL;
|
||||||
|
ID3D11RenderTargetView *rtv = NULL;
|
||||||
|
ID3D11DepthStencilView *dsv = NULL;
|
||||||
|
D3D11Texture *d3d11Texture;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
isRenderTarget = textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT;
|
||||||
|
isDepthStencil = textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT;
|
||||||
|
isSampler = textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_SAMPLER_BIT;
|
||||||
|
isCompute = textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_COMPUTE_BIT;
|
||||||
|
|
||||||
|
if (textureCreateInfo->depth <= 1)
|
||||||
|
{
|
||||||
|
D3D11_TEXTURE2D_DESC desc2D;
|
||||||
|
|
||||||
|
desc2D.Width = textureCreateInfo->width;
|
||||||
|
desc2D.Height = textureCreateInfo->height;
|
||||||
|
|
||||||
|
desc2D.BindFlags = 0;
|
||||||
|
if (isSampler)
|
||||||
|
{
|
||||||
|
desc2D.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
}
|
||||||
|
if (isCompute)
|
||||||
|
{
|
||||||
|
desc2D.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
|
||||||
|
}
|
||||||
|
if (isRenderTarget)
|
||||||
|
{
|
||||||
|
desc2D.BindFlags |= D3D11_BIND_RENDER_TARGET;
|
||||||
|
}
|
||||||
|
if (isDepthStencil)
|
||||||
|
{
|
||||||
|
desc2D.BindFlags |= D3D11_BIND_DEPTH_STENCIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc2D.ArraySize = textureCreateInfo->isCube ? 6 : 1;
|
||||||
|
desc2D.CPUAccessFlags = 0;
|
||||||
|
desc2D.Format = RefreshToD3D11_TextureFormat[textureCreateInfo->format];
|
||||||
|
desc2D.MipLevels = textureCreateInfo->levelCount;
|
||||||
|
desc2D.MiscFlags = (
|
||||||
|
(textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT) ?
|
||||||
|
D3D11_RESOURCE_MISC_GENERATE_MIPS :
|
||||||
|
0
|
||||||
|
);
|
||||||
|
desc2D.SampleDesc.Count = RefreshToD3D11_SampleCount[textureCreateInfo->sampleCount];
|
||||||
|
desc2D.SampleDesc.Quality = 0;
|
||||||
|
desc2D.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateTexture2D(
|
||||||
|
renderer->device,
|
||||||
|
&desc2D,
|
||||||
|
NULL,
|
||||||
|
(ID3D11Texture2D**) &textureHandle
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create Texture2D", NULL);
|
||||||
|
|
||||||
|
/* Create the SRV, if applicable */
|
||||||
|
if (isSampler)
|
||||||
|
{
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||||
|
srvDesc.Format = desc2D.Format;
|
||||||
|
|
||||||
|
if (textureCreateInfo->isCube)
|
||||||
|
{
|
||||||
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
|
||||||
|
srvDesc.TextureCube.MipLevels = desc2D.MipLevels;
|
||||||
|
srvDesc.TextureCube.MostDetailedMip = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||||
|
srvDesc.Texture2D.MipLevels = desc2D.MipLevels;
|
||||||
|
srvDesc.Texture2D.MostDetailedMip = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateShaderResourceView(
|
||||||
|
renderer->device,
|
||||||
|
textureHandle,
|
||||||
|
&srvDesc,
|
||||||
|
&srv
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
ID3D11Resource_Release(textureHandle);
|
||||||
|
D3D11_INTERNAL_LogError(renderer->device, "Could not create SRV for 2D texture", res);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
D3D11_TEXTURE3D_DESC desc3D;
|
||||||
|
|
||||||
|
desc3D.Width = textureCreateInfo->width;
|
||||||
|
desc3D.Height = textureCreateInfo->height;
|
||||||
|
desc3D.Depth = textureCreateInfo->depth;
|
||||||
|
|
||||||
|
desc3D.BindFlags = 0;
|
||||||
|
if (isSampler)
|
||||||
|
{
|
||||||
|
desc3D.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
}
|
||||||
|
if (isCompute)
|
||||||
|
{
|
||||||
|
desc3D.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
desc3D.CPUAccessFlags = 0;
|
||||||
|
desc3D.Format = RefreshToD3D11_TextureFormat[textureCreateInfo->format];
|
||||||
|
desc3D.MipLevels = textureCreateInfo->levelCount;
|
||||||
|
desc3D.MiscFlags = 0;
|
||||||
|
desc3D.Usage = D3D11_USAGE_DEFAULT;
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateTexture3D(
|
||||||
|
renderer->device,
|
||||||
|
&desc3D,
|
||||||
|
NULL,
|
||||||
|
(ID3D11Texture3D**) &textureHandle
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create Texture3D", NULL);
|
||||||
|
|
||||||
|
/* Create the SRV, if applicable */
|
||||||
|
if (isSampler)
|
||||||
|
{
|
||||||
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||||
|
|
||||||
|
srvDesc.Format = desc3D.Format;
|
||||||
|
srvDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE3D;
|
||||||
|
srvDesc.Texture3D.MipLevels = desc3D.MipLevels;
|
||||||
|
srvDesc.Texture3D.MostDetailedMip = 0;
|
||||||
|
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
ID3D11Resource_Release(textureHandle);
|
||||||
|
D3D11_INTERNAL_LogError(renderer->device, "Could not create SRV for 3D texture", res);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the RTV or DSV, if applicable */
|
||||||
|
if (isRenderTarget)
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED
|
||||||
|
}
|
||||||
|
else if (isDepthStencil)
|
||||||
|
{
|
||||||
|
NOT_IMPLEMENTED
|
||||||
|
}
|
||||||
|
|
||||||
|
d3d11Texture = (D3D11Texture*) SDL_malloc(sizeof(D3D11Texture));
|
||||||
|
d3d11Texture->handle = textureHandle;
|
||||||
|
d3d11Texture->format = textureCreateInfo->format;
|
||||||
|
d3d11Texture->width = textureCreateInfo->width;
|
||||||
|
d3d11Texture->height = textureCreateInfo->height;
|
||||||
|
d3d11Texture->depth = textureCreateInfo->depth;
|
||||||
|
d3d11Texture->levelCount = textureCreateInfo->levelCount;
|
||||||
|
d3d11Texture->isCube = textureCreateInfo->isCube;
|
||||||
|
d3d11Texture->targetView = isRenderTarget ? (ID3D11View*) rtv : (ID3D11View*) dsv;
|
||||||
|
d3d11Texture->shaderView = srv;
|
||||||
|
|
||||||
|
return (Refresh_Texture*) d3d11Texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Refresh_Buffer* D3D11_CreateBuffer(
|
static Refresh_Buffer* D3D11_CreateBuffer(
|
||||||
|
@ -1167,7 +1363,41 @@ static void D3D11_SetTextureData(
|
||||||
void *data,
|
void *data,
|
||||||
uint32_t dataLengthInBytes
|
uint32_t dataLengthInBytes
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||||
|
D3D11Texture *d3d11Texture = (D3D11Texture*) textureSlice->texture;
|
||||||
|
|
||||||
|
int32_t w = textureSlice->rectangle.w;
|
||||||
|
int32_t h = textureSlice->rectangle.h;
|
||||||
|
|
||||||
|
int32_t blockSize = Texture_GetBlockSize(d3d11Texture->format);
|
||||||
|
if (blockSize > 1)
|
||||||
|
{
|
||||||
|
w = (w + blockSize - 1) & ~(blockSize - 1);
|
||||||
|
h = (h + blockSize - 1) & ~(blockSize - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D11_BOX dstBox;
|
||||||
|
dstBox.left = textureSlice->rectangle.x;
|
||||||
|
dstBox.top = textureSlice->rectangle.y;
|
||||||
|
dstBox.front = textureSlice->depth;
|
||||||
|
dstBox.right = textureSlice->rectangle.x + w;
|
||||||
|
dstBox.bottom = textureSlice->rectangle.y + h;
|
||||||
|
dstBox.back = textureSlice->depth + 1;
|
||||||
|
|
||||||
|
ID3D11DeviceContext_UpdateSubresource(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
d3d11Texture->handle,
|
||||||
|
D3D11_INTERNAL_CalcSubresource(
|
||||||
|
textureSlice->level,
|
||||||
|
textureSlice->layer,
|
||||||
|
d3d11Texture->levelCount
|
||||||
|
),
|
||||||
|
&dstBox,
|
||||||
|
data,
|
||||||
|
BytesPerRow(w, d3d11Texture->format),
|
||||||
|
BytesPerImage(w, h, d3d11Texture->format)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_SetTextureDataYUV(
|
static void D3D11_SetTextureDataYUV(
|
||||||
|
@ -1292,7 +1522,32 @@ static void D3D11_BindFragmentSamplers(
|
||||||
Refresh_Texture **pTextures,
|
Refresh_Texture **pTextures,
|
||||||
Refresh_Sampler **pSamplers
|
Refresh_Sampler **pSamplers
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||||
|
ID3D11ShaderResourceView* srvs[MAX_TEXTURE_SAMPLERS];
|
||||||
|
ID3D11SamplerState* d3d11Samplers[MAX_TEXTURE_SAMPLERS];
|
||||||
|
|
||||||
|
int32_t numFragmentSamplers = d3d11CommandBuffer->graphicsPipeline->numFragmentSamplers;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numFragmentSamplers; i += 1)
|
||||||
|
{
|
||||||
|
srvs[i] = ((D3D11Texture*) pTextures[i])->shaderView;
|
||||||
|
d3d11Samplers[i] = ((D3D11Sampler*) pSamplers[i])->handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
ID3D11DeviceContext_PSSetShaderResources(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
0,
|
||||||
|
numFragmentSamplers,
|
||||||
|
srvs
|
||||||
|
);
|
||||||
|
|
||||||
|
ID3D11DeviceContext_PSSetSamplers(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
0,
|
||||||
|
numFragmentSamplers,
|
||||||
|
d3d11Samplers
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Getters */
|
/* Getters */
|
||||||
|
@ -1312,7 +1567,9 @@ static void D3D11_QueueDestroyTexture(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_Texture *texture
|
Refresh_Texture *texture
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11Texture *d3d11Texture = (D3D11Texture*) texture;
|
||||||
|
ID3D11Resource_Release(d3d11Texture->handle);
|
||||||
|
SDL_free(d3d11Texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void D3D11_QueueDestroySampler(
|
static void D3D11_QueueDestroySampler(
|
||||||
|
@ -1502,13 +1759,14 @@ static void D3D11_BeginRenderPass(
|
||||||
for (i = 0; i < colorAttachmentCount; i += 1)
|
for (i = 0; i < colorAttachmentCount; i += 1)
|
||||||
{
|
{
|
||||||
/* FIXME: Cube RTs */
|
/* FIXME: Cube RTs */
|
||||||
d3d11CommandBuffer->rtViews[i] = (ID3D11RenderTargetView*) ((D3D11Texture*) colorAttachmentInfos[i].texture)->twod.targetView;
|
|
||||||
|
d3d11CommandBuffer->rtViews[i] = (ID3D11RenderTargetView*) ((D3D11Texture*) colorAttachmentInfos[i].texture)->targetView;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the DSV for the depth stencil attachment, if applicable */
|
/* Get the DSV for the depth stencil attachment, if applicable */
|
||||||
if (depthStencilAttachmentInfo != NULL)
|
if (depthStencilAttachmentInfo != NULL)
|
||||||
{
|
{
|
||||||
d3d11CommandBuffer->dsView = (ID3D11DepthStencilView*) ((D3D11Texture*) depthStencilAttachmentInfo->texture)->twod.targetView;
|
d3d11CommandBuffer->dsView = (ID3D11DepthStencilView*) ((D3D11Texture*) depthStencilAttachmentInfo->texture)->targetView;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Actually set the RTs */
|
/* Actually set the RTs */
|
||||||
|
@ -1531,7 +1789,7 @@ static void D3D11_BeginRenderPass(
|
||||||
|
|
||||||
ID3D11DeviceContext_ClearRenderTargetView(
|
ID3D11DeviceContext_ClearRenderTargetView(
|
||||||
d3d11CommandBuffer->context,
|
d3d11CommandBuffer->context,
|
||||||
(ID3D11RenderTargetView*) ((D3D11Texture*) colorAttachmentInfos[i].texture)->twod.targetView,
|
(ID3D11RenderTargetView*) ((D3D11Texture*) colorAttachmentInfos[i].texture)->targetView,
|
||||||
clearColors
|
clearColors
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1553,7 +1811,7 @@ static void D3D11_BeginRenderPass(
|
||||||
{
|
{
|
||||||
ID3D11DeviceContext_ClearDepthStencilView(
|
ID3D11DeviceContext_ClearDepthStencilView(
|
||||||
d3d11CommandBuffer->context,
|
d3d11CommandBuffer->context,
|
||||||
(ID3D11DepthStencilView*) ((D3D11Texture*) depthStencilAttachmentInfo->texture)->twod.targetView,
|
(ID3D11DepthStencilView*) ((D3D11Texture*) depthStencilAttachmentInfo->texture)->targetView,
|
||||||
dsClearFlags,
|
dsClearFlags,
|
||||||
depthStencilAttachmentInfo->depthStencilClearValue.depth,
|
depthStencilAttachmentInfo->depthStencilClearValue.depth,
|
||||||
(uint8_t) depthStencilAttachmentInfo->depthStencilClearValue.stencil
|
(uint8_t) depthStencilAttachmentInfo->depthStencilClearValue.stencil
|
||||||
|
@ -1564,8 +1822,8 @@ static void D3D11_BeginRenderPass(
|
||||||
/* Set default viewport and scissor state */
|
/* Set default viewport and scissor state */
|
||||||
viewport.TopLeftX = 0;
|
viewport.TopLeftX = 0;
|
||||||
viewport.TopLeftY = 0;
|
viewport.TopLeftY = 0;
|
||||||
viewport.Width = (float) ((D3D11Texture*) colorAttachmentInfos[0].texture)->twod.width;
|
viewport.Width = (float) ((D3D11Texture*) colorAttachmentInfos[0].texture)->width;
|
||||||
viewport.Height = (float) ((D3D11Texture*) colorAttachmentInfos[0].texture)->twod.height;
|
viewport.Height = (float) ((D3D11Texture*) colorAttachmentInfos[0].texture)->height;
|
||||||
viewport.MinDepth = 0;
|
viewport.MinDepth = 0;
|
||||||
viewport.MaxDepth = 1;
|
viewport.MaxDepth = 1;
|
||||||
|
|
||||||
|
@ -1727,7 +1985,16 @@ static void D3D11_BindIndexBuffer(
|
||||||
uint64_t offset,
|
uint64_t offset,
|
||||||
Refresh_IndexElementSize indexElementSize
|
Refresh_IndexElementSize indexElementSize
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
|
D3D11CommandBuffer *d3d11CommandBuffer = (D3D11CommandBuffer*) commandBuffer;
|
||||||
|
D3D11Buffer *d3d11Buffer = (D3D11Buffer*) buffer;
|
||||||
|
|
||||||
|
ID3D11DeviceContext_IASetIndexBuffer(
|
||||||
|
d3d11CommandBuffer->context,
|
||||||
|
d3d11Buffer->handle,
|
||||||
|
RefreshToD3D11_IndexType[indexElementSize],
|
||||||
|
(UINT) offset
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute State */
|
/* Compute State */
|
||||||
|
@ -1795,7 +2062,7 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
renderer->device,
|
renderer->device,
|
||||||
(ID3D11Resource*) swapchainTexture,
|
(ID3D11Resource*) swapchainTexture,
|
||||||
&rtvDesc,
|
&rtvDesc,
|
||||||
(ID3D11RenderTargetView**) &pTexture->twod.targetView
|
(ID3D11RenderTargetView**) &pTexture->targetView
|
||||||
);
|
);
|
||||||
if (FAILED(res))
|
if (FAILED(res))
|
||||||
{
|
{
|
||||||
|
@ -1807,13 +2074,13 @@ static uint8_t D3D11_INTERNAL_InitializeSwapchainTexture(
|
||||||
/* Fill out the rest of the texture struct */
|
/* Fill out the rest of the texture struct */
|
||||||
pTexture->handle = NULL;
|
pTexture->handle = NULL;
|
||||||
pTexture->shaderView = NULL;
|
pTexture->shaderView = NULL;
|
||||||
pTexture->isRenderTarget = 1;
|
pTexture->depth = 1;
|
||||||
pTexture->rtType = REFRESH_D3D11_RENDERTARGET_2D;
|
pTexture->isCube = 0;
|
||||||
|
|
||||||
ID3D11Texture2D_GetDesc(swapchainTexture, &textureDesc);
|
ID3D11Texture2D_GetDesc(swapchainTexture, &textureDesc);
|
||||||
pTexture->levelCount = textureDesc.MipLevels;
|
pTexture->levelCount = textureDesc.MipLevels;
|
||||||
pTexture->twod.width = textureDesc.Width;
|
pTexture->width = textureDesc.Width;
|
||||||
pTexture->twod.height = textureDesc.Height;
|
pTexture->height = textureDesc.Height;
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
ID3D11Texture2D_Release(swapchainTexture);
|
ID3D11Texture2D_Release(swapchainTexture);
|
||||||
|
@ -1933,7 +2200,7 @@ static uint8_t D3D11_INTERNAL_ResizeSwapchain(
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
|
||||||
/* Release the old RTV */
|
/* Release the old RTV */
|
||||||
ID3D11RenderTargetView_Release(swapchainData->texture.twod.targetView);
|
ID3D11RenderTargetView_Release(swapchainData->texture.targetView);
|
||||||
|
|
||||||
/* Resize the swapchain */
|
/* Resize the swapchain */
|
||||||
res = IDXGISwapChain_ResizeBuffers(
|
res = IDXGISwapChain_ResizeBuffers(
|
||||||
|
@ -1972,7 +2239,7 @@ static void D3D11_INTERNAL_DestroySwapchain(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ID3D11RenderTargetView_Release(swapchainData->texture.twod.targetView);
|
ID3D11RenderTargetView_Release(swapchainData->texture.targetView);
|
||||||
IDXGISwapChain_Release(swapchainData->swapchain);
|
IDXGISwapChain_Release(swapchainData->swapchain);
|
||||||
|
|
||||||
windowData->swapchainData = NULL;
|
windowData->swapchainData = NULL;
|
||||||
|
@ -2107,8 +2374,8 @@ static Refresh_Texture* D3D11_AcquireSwapchainTexture(
|
||||||
d3d11CommandBuffer->swapchainData = swapchainData;
|
d3d11CommandBuffer->swapchainData = swapchainData;
|
||||||
|
|
||||||
/* Send the dimensions to the out parameters. */
|
/* Send the dimensions to the out parameters. */
|
||||||
*pWidth = swapchainData->texture.twod.width;
|
*pWidth = swapchainData->texture.width;
|
||||||
*pHeight = swapchainData->texture.twod.height;
|
*pHeight = swapchainData->texture.height;
|
||||||
|
|
||||||
/* Return the swapchain texture */
|
/* Return the swapchain texture */
|
||||||
return (Refresh_Texture*) &swapchainData->texture;
|
return (Refresh_Texture*) &swapchainData->texture;
|
||||||
|
|
Loading…
Reference in New Issue