mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-25 00:58:30 -05:00
Added blit.
This commit is contained in:
parent
e839f0ad7d
commit
ad5a46779a
10 changed files with 245 additions and 11 deletions
|
@ -2046,6 +2046,18 @@ namespace bgfx
|
||||||
///
|
///
|
||||||
void discard();
|
void discard();
|
||||||
|
|
||||||
|
/// Blit texture region between two textures.
|
||||||
|
///
|
||||||
|
/// @attention C99 equivalent is `bgfx_blit`.
|
||||||
|
///
|
||||||
|
void blit(uint8_t _id, TextureHandle _dst, uint16_t _dstX, uint16_t _dstY, TextureHandle _src, uint16_t _srcX = 0, uint16_t _srcY = 0, uint16_t _width = UINT16_MAX, uint16_t _height = UINT16_MAX);
|
||||||
|
|
||||||
|
/// Blit texture region between two textures.
|
||||||
|
///
|
||||||
|
/// @attention C99 equivalent is `bgfx_blit`.
|
||||||
|
///
|
||||||
|
void blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip = 0, uint16_t _srcX = 0, uint16_t _srcY = 0, uint16_t _srcZ = 0, uint16_t _width = UINT16_MAX, uint16_t _height = UINT16_MAX, uint16_t _depth = UINT16_MAX);
|
||||||
|
|
||||||
/// Request screen shot.
|
/// Request screen shot.
|
||||||
///
|
///
|
||||||
/// @param[in] _filePath Will be passed to `bgfx::CallbackI::screenShot` callback.
|
/// @param[in] _filePath Will be passed to `bgfx::CallbackI::screenShot` callback.
|
||||||
|
|
|
@ -310,6 +310,7 @@
|
||||||
#define BGFX_TEXTURE_COMPARE_MASK UINT32_C(0x000f0000) //!<
|
#define BGFX_TEXTURE_COMPARE_MASK UINT32_C(0x000f0000) //!<
|
||||||
#define BGFX_TEXTURE_COMPUTE_WRITE UINT32_C(0x00100000) //!<
|
#define BGFX_TEXTURE_COMPUTE_WRITE UINT32_C(0x00100000) //!<
|
||||||
#define BGFX_TEXTURE_SRGB UINT32_C(0x00200000) //!<
|
#define BGFX_TEXTURE_SRGB UINT32_C(0x00200000) //!<
|
||||||
|
#define BGFX_TEXTURE_BLIT_DST UINT32_C(0x00400000) //!<
|
||||||
#define BGFX_TEXTURE_BORDER_COLOR_SHIFT 24 //!<
|
#define BGFX_TEXTURE_BORDER_COLOR_SHIFT 24 //!<
|
||||||
#define BGFX_TEXTURE_BORDER_COLOR_MASK UINT32_C(0x0f000000) //!<
|
#define BGFX_TEXTURE_BORDER_COLOR_MASK UINT32_C(0x0f000000) //!<
|
||||||
#define BGFX_TEXTURE_RESERVED_SHIFT 28 //!<
|
#define BGFX_TEXTURE_RESERVED_SHIFT 28 //!<
|
||||||
|
|
|
@ -770,6 +770,9 @@ BGFX_C_API uint32_t bgfx_dispatch_indirect(uint8_t _id, bgfx_program_handle_t _h
|
||||||
/**/
|
/**/
|
||||||
BGFX_C_API void bgfx_discard();
|
BGFX_C_API void bgfx_discard();
|
||||||
|
|
||||||
|
/**/
|
||||||
|
BGFX_C_API void bgfx_blit(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, bgfx_texture_handle_t _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth);
|
||||||
|
|
||||||
/**/
|
/**/
|
||||||
BGFX_C_API void bgfx_save_screen_shot(const char* _filePath);
|
BGFX_C_API void bgfx_save_screen_shot(const char* _filePath);
|
||||||
|
|
||||||
|
|
51
src/bgfx.cpp
51
src/bgfx.cpp
|
@ -852,6 +852,31 @@ namespace bgfx
|
||||||
return m_num;
|
return m_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Frame::blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
|
||||||
|
{
|
||||||
|
uint16_t item = m_numBlitItems++;
|
||||||
|
|
||||||
|
BlitItem& blit = m_blitItem[item];
|
||||||
|
blit.m_srcX = _srcX;
|
||||||
|
blit.m_srcY = _srcY;
|
||||||
|
blit.m_srcZ = _srcZ;
|
||||||
|
blit.m_dstX = _dstX;
|
||||||
|
blit.m_dstY = _dstY;
|
||||||
|
blit.m_dstZ = _dstZ;
|
||||||
|
blit.m_width = _width;
|
||||||
|
blit.m_height = _height;
|
||||||
|
blit.m_depth = _depth;
|
||||||
|
blit.m_srcMip = _srcMip;
|
||||||
|
blit.m_dstMip = _dstMip;
|
||||||
|
blit.m_src = _src;
|
||||||
|
blit.m_dst = _dst;
|
||||||
|
|
||||||
|
BlitKey key;
|
||||||
|
key.m_view = _id;
|
||||||
|
key.m_item = item;
|
||||||
|
m_blitKeys[item] = key.encode();
|
||||||
|
}
|
||||||
|
|
||||||
void Frame::sort()
|
void Frame::sort()
|
||||||
{
|
{
|
||||||
for (uint32_t ii = 0, num = m_num; ii < num; ++ii)
|
for (uint32_t ii = 0, num = m_num; ii < num; ++ii)
|
||||||
|
@ -859,6 +884,12 @@ namespace bgfx
|
||||||
m_sortKeys[ii] = SortKey::remapView(m_sortKeys[ii], m_viewRemap);
|
m_sortKeys[ii] = SortKey::remapView(m_sortKeys[ii], m_viewRemap);
|
||||||
}
|
}
|
||||||
bx::radixSort64(m_sortKeys, s_ctx->m_tempKeys, m_sortValues, s_ctx->m_tempValues, m_num);
|
bx::radixSort64(m_sortKeys, s_ctx->m_tempKeys, m_sortValues, s_ctx->m_tempValues, m_num);
|
||||||
|
|
||||||
|
for (uint32_t ii = 0, num = m_num; ii < num; ++ii)
|
||||||
|
{
|
||||||
|
m_blitKeys[ii] = BlitKey::remapView(m_blitKeys[ii], m_viewRemap);
|
||||||
|
}
|
||||||
|
bx::radixSort32(m_blitKeys, (uint32_t*)&s_ctx->m_tempKeys, m_numBlitItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderFrame::Enum renderFrame()
|
RenderFrame::Enum renderFrame()
|
||||||
|
@ -1631,7 +1662,7 @@ again:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if 0
|
#if 1
|
||||||
if (s_rendererCreator[RendererType::Metal].supported)
|
if (s_rendererCreator[RendererType::Metal].supported)
|
||||||
{
|
{
|
||||||
_type = RendererType::Metal;
|
_type = RendererType::Metal;
|
||||||
|
@ -3241,6 +3272,17 @@ again:
|
||||||
s_ctx->discard();
|
s_ctx->discard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void blit(uint8_t _id, TextureHandle _dst, uint16_t _dstX, uint16_t _dstY, TextureHandle _src, uint16_t _srcX, uint16_t _srcY, uint16_t _width, uint16_t _height)
|
||||||
|
{
|
||||||
|
blit(_id, _dst, 0, _dstX, _dstY, 0, _src, 0, _srcX, _srcY, 0, _width, _height, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
|
||||||
|
{
|
||||||
|
BGFX_CHECK_MAIN_THREAD();
|
||||||
|
s_ctx->blit(_id, _dst, _dstMip, _dstX, _dstY, _dstZ, _src, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
|
||||||
|
}
|
||||||
|
|
||||||
void saveScreenShot(const char* _filePath)
|
void saveScreenShot(const char* _filePath)
|
||||||
{
|
{
|
||||||
BGFX_CHECK_MAIN_THREAD();
|
BGFX_CHECK_MAIN_THREAD();
|
||||||
|
@ -4059,6 +4101,13 @@ BGFX_C_API void bgfx_discard()
|
||||||
bgfx::discard();
|
bgfx::discard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BGFX_C_API void bgfx_blit(uint8_t _id, bgfx_texture_handle_t _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, bgfx_texture_handle_t _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth)
|
||||||
|
{
|
||||||
|
union { bgfx_texture_handle_t c; bgfx::TextureHandle cpp; } dst = { _dst };
|
||||||
|
union { bgfx_texture_handle_t c; bgfx::TextureHandle cpp; } src = { _src };
|
||||||
|
bgfx::blit(_id, dst.cpp, _dstMip, _dstX, _dstY, _dstZ, src.cpp, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
|
||||||
|
}
|
||||||
|
|
||||||
BGFX_C_API void bgfx_save_screen_shot(const char* _filePath)
|
BGFX_C_API void bgfx_save_screen_shot(const char* _filePath)
|
||||||
{
|
{
|
||||||
bgfx::saveScreenShot(_filePath);
|
bgfx::saveScreenShot(_filePath);
|
||||||
|
|
60
src/bgfx_p.h
60
src/bgfx_p.h
|
@ -759,6 +759,34 @@ namespace bgfx
|
||||||
};
|
};
|
||||||
#undef SORT_KEY_RENDER_DRAW
|
#undef SORT_KEY_RENDER_DRAW
|
||||||
|
|
||||||
|
struct BlitKey
|
||||||
|
{
|
||||||
|
uint32_t encode()
|
||||||
|
{
|
||||||
|
return 0
|
||||||
|
| (uint32_t(m_view) << 24)
|
||||||
|
| uint32_t(m_item)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
void decode(uint32_t _key)
|
||||||
|
{
|
||||||
|
m_item = uint16_t(_key & UINT16_MAX);
|
||||||
|
m_view = uint8_t(_key >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t remapView(uint32_t _key, uint8_t _viewRemap[BGFX_CONFIG_MAX_VIEWS])
|
||||||
|
{
|
||||||
|
const uint8_t oldView = uint8_t(_key >> 24);
|
||||||
|
const uint32_t view = uint32_t(_viewRemap[oldView]) << 24;
|
||||||
|
const uint32_t key = (_key & ~UINT32_C(0xff000000) ) | view;
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t m_item;
|
||||||
|
uint8_t m_view;
|
||||||
|
};
|
||||||
|
|
||||||
BX_ALIGN_DECL_16(struct) Matrix4
|
BX_ALIGN_DECL_16(struct) Matrix4
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
|
@ -1184,6 +1212,23 @@ namespace bgfx
|
||||||
RenderCompute compute;
|
RenderCompute compute;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BlitItem
|
||||||
|
{
|
||||||
|
uint16_t m_srcX;
|
||||||
|
uint16_t m_srcY;
|
||||||
|
uint16_t m_srcZ;
|
||||||
|
uint16_t m_dstX;
|
||||||
|
uint16_t m_dstY;
|
||||||
|
uint16_t m_dstZ;
|
||||||
|
uint16_t m_width;
|
||||||
|
uint16_t m_height;
|
||||||
|
uint16_t m_depth;
|
||||||
|
uint8_t m_srcMip;
|
||||||
|
uint8_t m_dstMip;
|
||||||
|
TextureHandle m_src;
|
||||||
|
TextureHandle m_dst;
|
||||||
|
};
|
||||||
|
|
||||||
struct Resolution
|
struct Resolution
|
||||||
{
|
{
|
||||||
Resolution()
|
Resolution()
|
||||||
|
@ -1274,9 +1319,10 @@ namespace bgfx
|
||||||
m_matrixCache.reset();
|
m_matrixCache.reset();
|
||||||
m_rectCache.reset();
|
m_rectCache.reset();
|
||||||
m_key.reset();
|
m_key.reset();
|
||||||
m_num = 0;
|
m_num = 0;
|
||||||
m_numRenderItems = 0;
|
m_numRenderItems = 0;
|
||||||
m_numDropped = 0;
|
m_numDropped = 0;
|
||||||
|
m_numBlitItems = 0;
|
||||||
m_iboffset = 0;
|
m_iboffset = 0;
|
||||||
m_vboffset = 0;
|
m_vboffset = 0;
|
||||||
m_cmdPre.start();
|
m_cmdPre.start();
|
||||||
|
@ -1501,6 +1547,8 @@ namespace bgfx
|
||||||
return dispatch(_id, _handle, 0, 0, 0, _flags);
|
return dispatch(_id, _handle, 0, 0, 0, _flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth);
|
||||||
|
|
||||||
void sort();
|
void sort();
|
||||||
|
|
||||||
bool checkAvailTransientIndexBuffer(uint32_t _num)
|
bool checkAvailTransientIndexBuffer(uint32_t _num)
|
||||||
|
@ -1622,6 +1670,8 @@ namespace bgfx
|
||||||
RenderItem m_renderItem[BGFX_CONFIG_MAX_DRAW_CALLS+1];
|
RenderItem m_renderItem[BGFX_CONFIG_MAX_DRAW_CALLS+1];
|
||||||
RenderDraw m_draw;
|
RenderDraw m_draw;
|
||||||
RenderCompute m_compute;
|
RenderCompute m_compute;
|
||||||
|
uint32_t m_blitKeys[BGFX_CONFIG_MAX_BLIT_ITEMS+1];
|
||||||
|
BlitItem m_blitItem[BGFX_CONFIG_MAX_BLIT_ITEMS+1];
|
||||||
uint64_t m_flags;
|
uint64_t m_flags;
|
||||||
uint32_t m_uniformBegin;
|
uint32_t m_uniformBegin;
|
||||||
uint32_t m_uniformEnd;
|
uint32_t m_uniformEnd;
|
||||||
|
@ -1632,6 +1682,7 @@ namespace bgfx
|
||||||
RenderItemCount m_num;
|
RenderItemCount m_num;
|
||||||
RenderItemCount m_numRenderItems;
|
RenderItemCount m_numRenderItems;
|
||||||
RenderItemCount m_numDropped;
|
RenderItemCount m_numDropped;
|
||||||
|
uint16_t m_numBlitItems;
|
||||||
|
|
||||||
MatrixCache m_matrixCache;
|
MatrixCache m_matrixCache;
|
||||||
RectCache m_rectCache;
|
RectCache m_rectCache;
|
||||||
|
@ -3559,6 +3610,11 @@ namespace bgfx
|
||||||
m_submit->discard();
|
m_submit->discard();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BGFX_API_FUNC(void blit(uint8_t _id, TextureHandle _dst, uint8_t _dstMip, uint16_t _dstX, uint16_t _dstY, uint16_t _dstZ, TextureHandle _src, uint8_t _srcMip, uint16_t _srcX, uint16_t _srcY, uint16_t _srcZ, uint16_t _width, uint16_t _height, uint16_t _depth) )
|
||||||
|
{
|
||||||
|
m_submit->blit(_id, _dst, _dstMip, _dstX, _dstY, _dstZ, _src, _srcMip, _srcX, _srcY, _srcZ, _width, _height, _depth);
|
||||||
|
}
|
||||||
|
|
||||||
BGFX_API_FUNC(uint32_t frame() );
|
BGFX_API_FUNC(uint32_t frame() );
|
||||||
|
|
||||||
void dumpViewStats();
|
void dumpViewStats();
|
||||||
|
|
|
@ -189,6 +189,10 @@
|
||||||
# define BGFX_CONFIG_MAX_DRAW_CALLS ( (64<<10)-1)
|
# define BGFX_CONFIG_MAX_DRAW_CALLS ( (64<<10)-1)
|
||||||
#endif // BGFX_CONFIG_MAX_DRAW_CALLS
|
#endif // BGFX_CONFIG_MAX_DRAW_CALLS
|
||||||
|
|
||||||
|
#ifndef BGFX_CONFIG_MAX_BLIT_ITEMS
|
||||||
|
# define BGFX_CONFIG_MAX_BLIT_ITEMS 256
|
||||||
|
#endif // BGFX_CONFIG_MAX_BLIT_ITEMS
|
||||||
|
|
||||||
#ifndef BGFX_CONFIG_MAX_MATRIX_CACHE
|
#ifndef BGFX_CONFIG_MAX_MATRIX_CACHE
|
||||||
# define BGFX_CONFIG_MAX_MATRIX_CACHE (BGFX_CONFIG_MAX_DRAW_CALLS+1)
|
# define BGFX_CONFIG_MAX_MATRIX_CACHE (BGFX_CONFIG_MAX_DRAW_CALLS+1)
|
||||||
#endif // BGFX_CONFIG_MAX_MATRIX_CACHE
|
#endif // BGFX_CONFIG_MAX_MATRIX_CACHE
|
||||||
|
|
|
@ -71,6 +71,7 @@ typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum targ
|
||||||
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
|
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
|
||||||
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
|
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
|
||||||
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
|
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
|
||||||
|
typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth);
|
||||||
typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
|
typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
|
||||||
typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
|
typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
|
||||||
typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
|
typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
|
||||||
|
@ -251,6 +252,7 @@ GL_IMPORT______(false, PFNGLCOMPRESSEDTEXIMAGE2DPROC, glCompressedT
|
||||||
GL_IMPORT______(false, PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D);
|
GL_IMPORT______(false, PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D);
|
||||||
GL_IMPORT______(true , PFNGLCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3D);
|
GL_IMPORT______(true , PFNGLCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3D);
|
||||||
GL_IMPORT______(true , PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D);
|
GL_IMPORT______(true , PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D);
|
||||||
|
GL_IMPORT______(true , PFNGLCOPYIMAGESUBDATAPROC, glCopyImageSubData);
|
||||||
GL_IMPORT______(false, PFNGLCREATEPROGRAMPROC, glCreateProgram);
|
GL_IMPORT______(false, PFNGLCREATEPROGRAMPROC, glCreateProgram);
|
||||||
GL_IMPORT______(false, PFNGLCREATESHADERPROC, glCreateShader);
|
GL_IMPORT______(false, PFNGLCREATESHADERPROC, glCreateShader);
|
||||||
GL_IMPORT______(false, PFNGLCULLFACEPROC, glCullFace);
|
GL_IMPORT______(false, PFNGLCULLFACEPROC, glCullFace);
|
||||||
|
@ -451,6 +453,8 @@ GL_IMPORT______(true, PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC, glGetTranslat
|
||||||
GL_IMPORT_ANGLE(true, PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer);
|
GL_IMPORT_ANGLE(true, PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer);
|
||||||
GL_IMPORT_ANGLE(true, PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample);
|
GL_IMPORT_ANGLE(true, PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample);
|
||||||
|
|
||||||
|
GL_IMPORT_EXT__(true , PFNGLCOPYIMAGESUBDATAPROC, glCopyImageSubData);
|
||||||
|
|
||||||
GL_IMPORT_KHR__(true, PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl);
|
GL_IMPORT_KHR__(true, PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl);
|
||||||
GL_IMPORT_KHR__(true, PFNGLDEBUGMESSAGEINSERTPROC, glDebugMessageInsert);
|
GL_IMPORT_KHR__(true, PFNGLDEBUGMESSAGEINSERTPROC, glDebugMessageInsert);
|
||||||
GL_IMPORT_KHR__(true, PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback);
|
GL_IMPORT_KHR__(true, PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback);
|
||||||
|
|
|
@ -4450,6 +4450,11 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
uint16_t view = UINT16_MAX;
|
uint16_t view = UINT16_MAX;
|
||||||
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
|
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
|
||||||
|
|
||||||
|
BlitKey blitKey;
|
||||||
|
blitKey.decode(_render->m_blitKeys[0]);
|
||||||
|
uint16_t numBlitItems = _render->m_numBlitItems;
|
||||||
|
uint16_t blitItem = 0;
|
||||||
|
|
||||||
const uint64_t primType = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0;
|
const uint64_t primType = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0;
|
||||||
uint8_t primIndex = uint8_t(primType >> BGFX_STATE_PT_SHIFT);
|
uint8_t primIndex = uint8_t(primType >> BGFX_STATE_PT_SHIFT);
|
||||||
PrimInfo prim = s_primInfo[primIndex];
|
PrimInfo prim = s_primInfo[primIndex];
|
||||||
|
@ -4583,6 +4588,33 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
|
clearQuad(_clearQuad, viewState.m_rect, clr, _render->m_colorPalette);
|
||||||
prim = s_primInfo[BX_COUNTOF(s_primName)]; // Force primitive type update after clear quad.
|
prim = s_primInfo[BX_COUNTOF(s_primName)]; // Force primitive type update after clear quad.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (; blitItem < numBlitItems && blitKey.m_view == view; blitItem++)
|
||||||
|
{
|
||||||
|
const BlitItem& blit = _render->m_blitItem[blitItem];
|
||||||
|
blitKey.decode(_render->m_blitKeys[blitItem+1]);
|
||||||
|
|
||||||
|
const TextureD3D11 src = m_textures[blit.m_src.idx];
|
||||||
|
const TextureD3D11 dst = m_textures[blit.m_dst.idx];
|
||||||
|
|
||||||
|
D3D11_BOX box;
|
||||||
|
box.left = blit.m_srcX;
|
||||||
|
box.top = blit.m_srcY;
|
||||||
|
box.front = blit.m_srcZ;
|
||||||
|
box.right = blit.m_srcX + blit.m_width;
|
||||||
|
box.bottom = blit.m_srcY + blit.m_height;
|
||||||
|
box.back = blit.m_srcZ + bx::uint16_max(blit.m_depth, 1);
|
||||||
|
|
||||||
|
deviceCtx->CopySubresourceRegion(dst.m_ptr
|
||||||
|
, blit.m_dstMip
|
||||||
|
, blit.m_dstX
|
||||||
|
, blit.m_dstY
|
||||||
|
, blit.m_dstZ
|
||||||
|
, src.m_ptr
|
||||||
|
, blit.m_srcMip
|
||||||
|
, &box
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCompute)
|
if (isCompute)
|
||||||
|
|
|
@ -2290,22 +2290,23 @@ namespace bgfx { namespace d3d9
|
||||||
|
|
||||||
void TextureD3D9::createTexture(uint32_t _width, uint32_t _height, uint8_t _numMips)
|
void TextureD3D9::createTexture(uint32_t _width, uint32_t _height, uint8_t _numMips)
|
||||||
{
|
{
|
||||||
m_width = (uint16_t)_width;
|
m_width = (uint16_t)_width;
|
||||||
m_height = (uint16_t)_height;
|
m_height = (uint16_t)_height;
|
||||||
m_numMips = _numMips;
|
m_numMips = _numMips;
|
||||||
m_type = Texture2D;
|
m_type = Texture2D;
|
||||||
const TextureFormat::Enum fmt = (TextureFormat::Enum)m_textureFormat;
|
const TextureFormat::Enum fmt = (TextureFormat::Enum)m_textureFormat;
|
||||||
|
|
||||||
DWORD usage = 0;
|
DWORD usage = 0;
|
||||||
D3DPOOL pool = s_renderD3D9->m_pool;
|
D3DPOOL pool = s_renderD3D9->m_pool;
|
||||||
|
|
||||||
const bool renderTarget = 0 != (m_flags&BGFX_TEXTURE_RT_MASK);
|
const bool renderTarget = 0 != (m_flags&BGFX_TEXTURE_RT_MASK);
|
||||||
|
const bool blit = 0 != (m_flags&BGFX_TEXTURE_BLIT_DST);
|
||||||
if (isDepth(fmt) )
|
if (isDepth(fmt) )
|
||||||
{
|
{
|
||||||
usage = D3DUSAGE_DEPTHSTENCIL;
|
usage = D3DUSAGE_DEPTHSTENCIL;
|
||||||
pool = D3DPOOL_DEFAULT;
|
pool = D3DPOOL_DEFAULT;
|
||||||
}
|
}
|
||||||
else if (renderTarget)
|
else if (renderTarget || blit)
|
||||||
{
|
{
|
||||||
usage = D3DUSAGE_RENDERTARGET;
|
usage = D3DUSAGE_RENDERTARGET;
|
||||||
pool = D3DPOOL_DEFAULT;
|
pool = D3DPOOL_DEFAULT;
|
||||||
|
@ -2793,7 +2794,7 @@ namespace bgfx { namespace d3d9
|
||||||
{
|
{
|
||||||
TextureFormat::Enum fmt = (TextureFormat::Enum)m_textureFormat;
|
TextureFormat::Enum fmt = (TextureFormat::Enum)m_textureFormat;
|
||||||
if (TextureFormat::Unknown != fmt
|
if (TextureFormat::Unknown != fmt
|
||||||
&& (isDepth(fmt) || !!(m_flags&BGFX_TEXTURE_RT_MASK) ) )
|
&& (isDepth(fmt) || !!(m_flags&(BGFX_TEXTURE_RT_MASK|BGFX_TEXTURE_BLIT_DST) ) ) )
|
||||||
{
|
{
|
||||||
DX_RELEASE(m_ptr, 0);
|
DX_RELEASE(m_ptr, 0);
|
||||||
DX_RELEASE(m_surface, 0);
|
DX_RELEASE(m_surface, 0);
|
||||||
|
@ -2804,7 +2805,7 @@ namespace bgfx { namespace d3d9
|
||||||
{
|
{
|
||||||
TextureFormat::Enum fmt = (TextureFormat::Enum)m_textureFormat;
|
TextureFormat::Enum fmt = (TextureFormat::Enum)m_textureFormat;
|
||||||
if (TextureFormat::Unknown != fmt
|
if (TextureFormat::Unknown != fmt
|
||||||
&& (isDepth(fmt) || !!(m_flags&BGFX_TEXTURE_RT_MASK) ) )
|
&& (isDepth(fmt) || !!(m_flags&(BGFX_TEXTURE_RT_MASK|BGFX_TEXTURE_BLIT_DST)) ) )
|
||||||
{
|
{
|
||||||
createTexture(m_width, m_height, m_numMips);
|
createTexture(m_width, m_height, m_numMips);
|
||||||
}
|
}
|
||||||
|
@ -3202,6 +3203,11 @@ namespace bgfx { namespace d3d9
|
||||||
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
|
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
|
||||||
uint32_t blendFactor = 0;
|
uint32_t blendFactor = 0;
|
||||||
|
|
||||||
|
BlitKey blitKey;
|
||||||
|
blitKey.decode(_render->m_blitKeys[0]);
|
||||||
|
uint16_t numBlitItems = _render->m_numBlitItems;
|
||||||
|
uint16_t blitItem = 0;
|
||||||
|
|
||||||
uint8_t primIndex;
|
uint8_t primIndex;
|
||||||
{
|
{
|
||||||
const uint64_t pt = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0;
|
const uint64_t pt = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0;
|
||||||
|
@ -3293,6 +3299,33 @@ namespace bgfx { namespace d3d9
|
||||||
DX_CHECK(device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) );
|
DX_CHECK(device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) );
|
||||||
DX_CHECK(device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE) );
|
DX_CHECK(device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE) );
|
||||||
DX_CHECK(device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER) );
|
DX_CHECK(device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER) );
|
||||||
|
|
||||||
|
for (; blitItem < numBlitItems && blitKey.m_view == view; blitItem++)
|
||||||
|
{
|
||||||
|
const BlitItem& blit = _render->m_blitItem[blitItem];
|
||||||
|
blitKey.decode(_render->m_blitKeys[blitItem+1]);
|
||||||
|
|
||||||
|
const TextureD3D9 src = m_textures[blit.m_src.idx];
|
||||||
|
const TextureD3D9 dst = m_textures[blit.m_dst.idx];
|
||||||
|
|
||||||
|
RECT srcRect = { blit.m_srcX, blit.m_srcY, blit.m_srcX + blit.m_width, blit.m_srcY + blit.m_height };
|
||||||
|
RECT dstRect = { blit.m_dstX, blit.m_dstY, blit.m_dstX + blit.m_width, blit.m_dstY + blit.m_height };
|
||||||
|
|
||||||
|
IDirect3DSurface9* srcSurface;
|
||||||
|
DX_CHECK(src.m_texture2d->GetSurfaceLevel(blit.m_srcMip, &srcSurface) );
|
||||||
|
|
||||||
|
IDirect3DSurface9* dstSurface;
|
||||||
|
DX_CHECK(dst.m_texture2d->GetSurfaceLevel(blit.m_dstMip, &dstSurface) );
|
||||||
|
|
||||||
|
DX_CHECK(m_device->StretchRect(srcSurface
|
||||||
|
, &srcRect
|
||||||
|
, dstSurface
|
||||||
|
, &dstRect
|
||||||
|
, D3DTEXF_NONE
|
||||||
|
) );
|
||||||
|
srcSurface->Release();
|
||||||
|
dstSurface->Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t scissor = draw.m_scissor;
|
uint16_t scissor = draw.m_scissor;
|
||||||
|
|
|
@ -441,6 +441,7 @@ namespace bgfx { namespace gl
|
||||||
|
|
||||||
ARB_compute_shader,
|
ARB_compute_shader,
|
||||||
ARB_conservative_depth,
|
ARB_conservative_depth,
|
||||||
|
ARB_copy_image,
|
||||||
ARB_debug_label,
|
ARB_debug_label,
|
||||||
ARB_debug_output,
|
ARB_debug_output,
|
||||||
ARB_depth_buffer_float,
|
ARB_depth_buffer_float,
|
||||||
|
@ -499,6 +500,7 @@ namespace bgfx { namespace gl
|
||||||
EXT_blend_subtract,
|
EXT_blend_subtract,
|
||||||
EXT_color_buffer_half_float,
|
EXT_color_buffer_half_float,
|
||||||
EXT_color_buffer_float,
|
EXT_color_buffer_float,
|
||||||
|
EXT_copy_image,
|
||||||
EXT_compressed_ETC1_RGB8_sub_texture,
|
EXT_compressed_ETC1_RGB8_sub_texture,
|
||||||
EXT_debug_label,
|
EXT_debug_label,
|
||||||
EXT_debug_marker,
|
EXT_debug_marker,
|
||||||
|
@ -554,10 +556,12 @@ namespace bgfx { namespace gl
|
||||||
MOZ_WEBGL_compressed_texture_s3tc,
|
MOZ_WEBGL_compressed_texture_s3tc,
|
||||||
MOZ_WEBGL_depth_texture,
|
MOZ_WEBGL_depth_texture,
|
||||||
|
|
||||||
NV_texture_border_clamp,
|
NV_copy_image,
|
||||||
NV_draw_buffers,
|
NV_draw_buffers,
|
||||||
|
NV_texture_border_clamp,
|
||||||
NVX_gpu_memory_info,
|
NVX_gpu_memory_info,
|
||||||
|
|
||||||
|
OES_copy_image,
|
||||||
OES_compressed_ETC1_RGB8_texture,
|
OES_compressed_ETC1_RGB8_texture,
|
||||||
OES_depth24,
|
OES_depth24,
|
||||||
OES_depth32,
|
OES_depth32,
|
||||||
|
@ -640,6 +644,7 @@ namespace bgfx { namespace gl
|
||||||
|
|
||||||
{ "ARB_compute_shader", BGFX_CONFIG_RENDERER_OPENGL >= 43, true },
|
{ "ARB_compute_shader", BGFX_CONFIG_RENDERER_OPENGL >= 43, true },
|
||||||
{ "ARB_conservative_depth", BGFX_CONFIG_RENDERER_OPENGL >= 42, true },
|
{ "ARB_conservative_depth", BGFX_CONFIG_RENDERER_OPENGL >= 42, true },
|
||||||
|
{ "ARB_copy_image", BGFX_CONFIG_RENDERER_OPENGL >= 42, true },
|
||||||
{ "ARB_debug_label", false, true },
|
{ "ARB_debug_label", false, true },
|
||||||
{ "ARB_debug_output", BGFX_CONFIG_RENDERER_OPENGL >= 43, true },
|
{ "ARB_debug_output", BGFX_CONFIG_RENDERER_OPENGL >= 43, true },
|
||||||
{ "ARB_depth_buffer_float", BGFX_CONFIG_RENDERER_OPENGL >= 33, true },
|
{ "ARB_depth_buffer_float", BGFX_CONFIG_RENDERER_OPENGL >= 33, true },
|
||||||
|
@ -698,6 +703,7 @@ namespace bgfx { namespace gl
|
||||||
{ "EXT_blend_subtract", BGFX_CONFIG_RENDERER_OPENGL >= 14, true },
|
{ "EXT_blend_subtract", BGFX_CONFIG_RENDERER_OPENGL >= 14, true },
|
||||||
{ "EXT_color_buffer_half_float", false, true }, // GLES2 extension.
|
{ "EXT_color_buffer_half_float", false, true }, // GLES2 extension.
|
||||||
{ "EXT_color_buffer_float", false, true }, // GLES2 extension.
|
{ "EXT_color_buffer_float", false, true }, // GLES2 extension.
|
||||||
|
{ "EXT_copy_image", false, true }, // GLES2 extension.
|
||||||
{ "EXT_compressed_ETC1_RGB8_sub_texture", false, true }, // GLES2 extension.
|
{ "EXT_compressed_ETC1_RGB8_sub_texture", false, true }, // GLES2 extension.
|
||||||
{ "EXT_debug_label", false, true },
|
{ "EXT_debug_label", false, true },
|
||||||
{ "EXT_debug_marker", false, true },
|
{ "EXT_debug_marker", false, true },
|
||||||
|
@ -753,10 +759,12 @@ namespace bgfx { namespace gl
|
||||||
{ "MOZ_WEBGL_compressed_texture_s3tc", false, true },
|
{ "MOZ_WEBGL_compressed_texture_s3tc", false, true },
|
||||||
{ "MOZ_WEBGL_depth_texture", false, true },
|
{ "MOZ_WEBGL_depth_texture", false, true },
|
||||||
|
|
||||||
{ "NV_texture_border_clamp", false, true }, // GLES2 extension.
|
{ "NV_copy_image", false, true },
|
||||||
{ "NV_draw_buffers", false, true }, // GLES2 extension.
|
{ "NV_draw_buffers", false, true }, // GLES2 extension.
|
||||||
|
{ "NV_texture_border_clamp", false, true }, // GLES2 extension.
|
||||||
{ "NVX_gpu_memory_info", false, true },
|
{ "NVX_gpu_memory_info", false, true },
|
||||||
|
|
||||||
|
{ "OES_copy_image", false, true },
|
||||||
{ "OES_compressed_ETC1_RGB8_texture", false, true },
|
{ "OES_compressed_ETC1_RGB8_texture", false, true },
|
||||||
{ "OES_depth24", false, true },
|
{ "OES_depth24", false, true },
|
||||||
{ "OES_depth32", false, true },
|
{ "OES_depth32", false, true },
|
||||||
|
@ -5105,6 +5113,12 @@ namespace bgfx { namespace gl
|
||||||
SortKey key;
|
SortKey key;
|
||||||
uint16_t view = UINT16_MAX;
|
uint16_t view = UINT16_MAX;
|
||||||
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
|
FrameBufferHandle fbh = BGFX_INVALID_HANDLE;
|
||||||
|
|
||||||
|
BlitKey blitKey;
|
||||||
|
blitKey.decode(_render->m_blitKeys[0]);
|
||||||
|
uint16_t numBlitItems = _render->m_numBlitItems;
|
||||||
|
uint16_t blitItem = 0;
|
||||||
|
|
||||||
int32_t height = hmdEnabled
|
int32_t height = hmdEnabled
|
||||||
? _render->m_hmd.height
|
? _render->m_hmd.height
|
||||||
: _render->m_resolution.m_height
|
: _render->m_resolution.m_height
|
||||||
|
@ -5257,6 +5271,32 @@ namespace bgfx { namespace gl
|
||||||
GL_CHECK(glDepthFunc(GL_LESS) );
|
GL_CHECK(glDepthFunc(GL_LESS) );
|
||||||
GL_CHECK(glEnable(GL_CULL_FACE) );
|
GL_CHECK(glEnable(GL_CULL_FACE) );
|
||||||
GL_CHECK(glDisable(GL_BLEND) );
|
GL_CHECK(glDisable(GL_BLEND) );
|
||||||
|
|
||||||
|
for (; blitItem < numBlitItems && blitKey.m_view == view; blitItem++)
|
||||||
|
{
|
||||||
|
const BlitItem& blit = _render->m_blitItem[blitItem];
|
||||||
|
blitKey.decode(_render->m_blitKeys[blitItem+1]);
|
||||||
|
|
||||||
|
const TextureGL src = m_textures[blit.m_src.idx];
|
||||||
|
const TextureGL dst = m_textures[blit.m_dst.idx];
|
||||||
|
|
||||||
|
GL_CHECK(glCopyImageSubData(src.m_id
|
||||||
|
, src.m_target
|
||||||
|
, blit.m_srcMip
|
||||||
|
, blit.m_srcX
|
||||||
|
, blit.m_srcY
|
||||||
|
, blit.m_srcZ
|
||||||
|
, dst.m_id
|
||||||
|
, dst.m_target
|
||||||
|
, blit.m_dstMip
|
||||||
|
, blit.m_dstX
|
||||||
|
, blit.m_dstY
|
||||||
|
, blit.m_dstZ
|
||||||
|
, blit.m_width
|
||||||
|
, blit.m_height
|
||||||
|
, bx::uint32_max(blit.m_depth, 1)
|
||||||
|
) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCompute)
|
if (isCompute)
|
||||||
|
|
Loading…
Reference in a new issue