summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer_d3d9.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d9.cpp')
-rw-r--r--3rdparty/bgfx/src/renderer_d3d9.cpp223
1 files changed, 119 insertions, 104 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d9.cpp b/3rdparty/bgfx/src/renderer_d3d9.cpp
index dc51a9eef3f..919a952260b 100644
--- a/3rdparty/bgfx/src/renderer_d3d9.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d9.cpp
@@ -603,85 +603,85 @@ namespace bgfx { namespace d3d9
s_textureFormat[TextureFormat::BC5].m_fmt = s_extendedFormats[ExtendedFormat::Ati2].m_supported ? D3DFMT_ATI2 : D3DFMT_UNKNOWN;
g_caps.supported |= m_instancingSupport ? BGFX_CAPS_INSTANCING : 0;
+ }
- for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
- {
- uint8_t support = 0;
+ for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
+ {
+ uint8_t support = 0;
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , 0
- , D3DRTYPE_TEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_2D : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , D3DUSAGE_QUERY_SRGBREAD
- , D3DRTYPE_TEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , 0
- , D3DRTYPE_VOLUMETEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_3D : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , D3DUSAGE_QUERY_SRGBREAD
- , D3DRTYPE_VOLUMETEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , 0
- , D3DRTYPE_CUBETEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_CUBE : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , D3DUSAGE_QUERY_SRGBREAD
- , D3DRTYPE_CUBETEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , D3DUSAGE_QUERY_VERTEXTEXTURE
- , D3DRTYPE_TEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_VERTEX : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
- , m_deviceType
- , adapterFormat
- , isDepth(TextureFormat::Enum(ii) ) ? D3DUSAGE_DEPTHSTENCIL : D3DUSAGE_RENDERTARGET
- , D3DRTYPE_TEXTURE
- , s_textureFormat[ii].m_fmt
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER : BGFX_CAPS_FORMAT_TEXTURE_NONE;
-
- support |= SUCCEEDED(m_d3d9->CheckDeviceMultiSampleType(m_adapter
- , m_deviceType
- , s_textureFormat[ii].m_fmt
- , true
- , D3DMULTISAMPLE_2_SAMPLES
- , NULL
- ) ) ? BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , 0
+ , D3DRTYPE_TEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_2D : BGFX_CAPS_FORMAT_TEXTURE_NONE;
- g_caps.formats[ii] = support;
- }
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , D3DUSAGE_QUERY_SRGBREAD
+ , D3DRTYPE_TEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , 0
+ , D3DRTYPE_VOLUMETEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_3D : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , D3DUSAGE_QUERY_SRGBREAD
+ , D3DRTYPE_VOLUMETEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , 0
+ , D3DRTYPE_CUBETEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_CUBE : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , D3DUSAGE_QUERY_SRGBREAD
+ , D3DRTYPE_CUBETEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , D3DUSAGE_QUERY_VERTEXTEXTURE
+ , D3DRTYPE_TEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_VERTEX : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceFormat(m_adapter
+ , m_deviceType
+ , adapterFormat
+ , isDepth(TextureFormat::Enum(ii) ) ? D3DUSAGE_DEPTHSTENCIL : D3DUSAGE_RENDERTARGET
+ , D3DRTYPE_TEXTURE
+ , s_textureFormat[ii].m_fmt
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ support |= SUCCEEDED(m_d3d9->CheckDeviceMultiSampleType(m_adapter
+ , m_deviceType
+ , s_textureFormat[ii].m_fmt
+ , true
+ , D3DMULTISAMPLE_2_SAMPLES
+ , NULL
+ ) ) ? BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER_MSAA : BGFX_CAPS_FORMAT_TEXTURE_NONE;
+
+ g_caps.formats[ii] = support;
}
m_fmtDepth = D3DFMT_D24S8;
@@ -752,6 +752,7 @@ namespace bgfx { namespace d3d9
m_initialized = true;
+ g_internalData.context = m_device;
return true;
error:
@@ -996,14 +997,30 @@ namespace bgfx { namespace d3d9
texture.m_height = _height;
}
+ void overrideInternal(TextureHandle _handle, uintptr_t _ptr) BX_OVERRIDE
+ {
+ // Resource ref. counts might be messed up outside of bgfx.
+ // Disabling ref. count check once texture is overridden.
+ setGraphicsDebuggerPresent(true);
+ m_textures[_handle.idx].overrideInternal(_ptr);
+ }
+
+ uintptr_t getInternal(TextureHandle _handle) BX_OVERRIDE
+ {
+ // Resource ref. counts might be messed up outside of bgfx.
+ // Disabling ref. count check once texture is overridden.
+ setGraphicsDebuggerPresent(true);
+ return uintptr_t(m_textures[_handle.idx].m_ptr);
+ }
+
void destroyTexture(TextureHandle _handle) BX_OVERRIDE
{
m_textures[_handle.idx].destroy();
}
- void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const TextureHandle* _textureHandles) BX_OVERRIDE
+ void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const Attachment* _attachment) BX_OVERRIDE
{
- m_frameBuffers[_handle.idx].create(_num, _textureHandles);
+ m_frameBuffers[_handle.idx].create(_num, _attachment);
}
void createFrameBuffer(FrameBufferHandle _handle, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat) BX_OVERRIDE
@@ -1925,30 +1942,34 @@ namespace bgfx { namespace d3d9
device->SetVertexShader(program.m_vsh->m_vertexShader);
device->SetPixelShader(program.m_fsh->m_pixelShader);
+ float mrtClear[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4];
+
if (BGFX_CLEAR_COLOR_USE_PALETTE & _clear.m_flags)
{
- float mrtClear[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4];
for (uint32_t ii = 0; ii < numMrt; ++ii)
{
- uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE-1, _clear.m_index[ii]);
+ uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE - 1, _clear.m_index[ii]);
memcpy(mrtClear[ii], _palette[index], 16);
}
-
- DX_CHECK(m_device->SetPixelShaderConstantF(0, mrtClear[0], numMrt) );
}
else
{
float rgba[4] =
{
- _clear.m_index[0]*1.0f/255.0f,
- _clear.m_index[1]*1.0f/255.0f,
- _clear.m_index[2]*1.0f/255.0f,
- _clear.m_index[3]*1.0f/255.0f,
+ _clear.m_index[0] * 1.0f / 255.0f,
+ _clear.m_index[1] * 1.0f / 255.0f,
+ _clear.m_index[2] * 1.0f / 255.0f,
+ _clear.m_index[3] * 1.0f / 255.0f,
};
- DX_CHECK(m_device->SetPixelShaderConstantF(0, rgba, 1) );
+ for (uint32_t ii = 0; ii < numMrt; ++ii)
+ {
+ memcpy(mrtClear[ii], rgba, 16);
+ }
}
+ DX_CHECK(device->SetPixelShaderConstantF(0, mrtClear[0], numMrt));
+
DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, stride) );
DX_CHECK(device->SetStreamSourceFreq(0, 1) );
DX_CHECK(device->SetStreamSource(1, NULL, 0, 0) );
@@ -2427,10 +2448,10 @@ namespace bgfx { namespace d3d9
uint32_t msaaQuality = ( (m_flags&BGFX_TEXTURE_RT_MSAA_MASK)>>BGFX_TEXTURE_RT_MSAA_SHIFT);
msaaQuality = bx::uint32_satsub(msaaQuality, 1);
- bool bufferOnly = 0 != (m_flags&BGFX_TEXTURE_RT_BUFFER_ONLY);
+ bool writeOnly = 0 != (m_flags&BGFX_TEXTURE_RT_WRITE_ONLY);
if (0 != msaaQuality
- || bufferOnly)
+ || writeOnly)
{
const Msaa& msaa = s_msaa[msaaQuality];
@@ -2461,7 +2482,7 @@ namespace bgfx { namespace d3d9
) );
}
- if (bufferOnly)
+ if (writeOnly)
{
// This is render buffer, there is no sampling, no need
// to create texture.
@@ -2798,8 +2819,8 @@ namespace bgfx { namespace d3d9
m_height = textureHeight;
m_depth = imageContainer.m_depth;
m_numMips = numMips;
- m_requestedFormat = imageContainer.m_format;
- m_textureFormat = imageContainer.m_format;
+ m_requestedFormat =
+ m_textureFormat = uint8_t(imageContainer.m_format);
const TextureFormatInfo& tfi = s_textureFormat[m_requestedFormat];
uint8_t bpp = getBitsPerPixel(TextureFormat::Enum(m_textureFormat) );
@@ -2837,7 +2858,7 @@ namespace bgfx { namespace d3d9
, 0 != (m_flags&BGFX_TEXTURE_RT_MASK) ? " (render target)" : ""
);
- if (0 != (_flags&BGFX_TEXTURE_RT_BUFFER_ONLY) )
+ if (0 != (_flags&BGFX_TEXTURE_RT_WRITE_ONLY) )
{
return;
}
@@ -2892,13 +2913,7 @@ namespace bgfx { namespace d3d9
, mip.m_format
);
- uint32_t dstpitch = pitch;
- for (uint32_t yy = 0; yy < height; ++yy)
- {
- uint8_t* src = &temp[yy*srcpitch];
- uint8_t* dst = &bits[yy*dstpitch];
- memcpy(dst, src, dstpitch);
- }
+ bx::memCopy(bits, temp, pitch, height, srcpitch, pitch);
BX_FREE(g_allocator, temp);
}
@@ -2950,7 +2965,7 @@ namespace bgfx { namespace d3d9
if (convert)
{
temp = (uint8_t*)BX_ALLOC(g_allocator, rectpitch*_rect.m_height);
- imageDecodeToBgra8(temp, data, _rect.m_width, _rect.m_height, srcpitch, m_requestedFormat);
+ imageDecodeToBgra8(temp, data, _rect.m_width, _rect.m_height, srcpitch, TextureFormat::Enum(m_requestedFormat) );
data = temp;
}
@@ -3047,7 +3062,7 @@ namespace bgfx { namespace d3d9
}
}
- void FrameBufferD3D9::create(uint8_t _num, const TextureHandle* _handles)
+ void FrameBufferD3D9::create(uint8_t _num, const Attachment* _attachment)
{
for (uint32_t ii = 0; ii < BX_COUNTOF(m_color); ++ii)
{
@@ -3059,7 +3074,7 @@ namespace bgfx { namespace d3d9
m_needResolve = false;
for (uint32_t ii = 0; ii < _num; ++ii)
{
- TextureHandle handle = _handles[ii];
+ TextureHandle handle = _attachment[ii].handle;
if (isValid(handle) )
{
const TextureD3D9& texture = s_renderD3D9->m_textures[handle.idx];
@@ -3087,7 +3102,7 @@ namespace bgfx { namespace d3d9
}
else
{
- m_color[m_num] = texture.getSurface();
+ m_color[m_num] = texture.getSurface(uint8_t(_attachment[ii].layer) );
}
m_num++;
}