summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp')
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp108
1 files changed, 98 insertions, 10 deletions
diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
index 77699841c01..fccee88db6e 100644
--- a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
+++ b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
- * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ * Copyright 2011-2022 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
*/
//
@@ -48,7 +48,7 @@ static const bgfx::EmbeddedShader s_embeddedShaders[] =
namespace
{
- static bgfx::VertexDecl s_nvgDecl;
+ static bgfx::VertexLayout s_nvgLayout;
enum GLNVGshaderType
{
@@ -271,7 +271,7 @@ namespace
gl->u_scissorExtScale = bgfx::createUniform("u_scissorExtScale", bgfx::UniformType::Vec4);
gl->u_extentRadius = bgfx::createUniform("u_extentRadius", bgfx::UniformType::Vec4);
gl->u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4);
- gl->s_tex = bgfx::createUniform("s_tex", bgfx::UniformType::Int1);
+ gl->s_tex = bgfx::createUniform("s_tex", bgfx::UniformType::Sampler);
if (bgfx::getRendererType() == bgfx::RendererType::Direct3D9)
{
@@ -282,7 +282,7 @@ namespace
gl->u_halfTexel.idx = bgfx::kInvalidHandle;
}
- s_nvgDecl
+ s_nvgLayout
.begin()
.add(bgfx::Attrib::Position, 2, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
@@ -370,7 +370,11 @@ namespace
uint32_t pitch = tex->width * bytesPerPixel;
const bgfx::Memory* mem = bgfx::alloc(w * h * bytesPerPixel);
- bx::gather(mem->data, data + y * pitch + x * bytesPerPixel, w * bytesPerPixel, h, pitch);
+ bx::gather(mem->data, // dst
+ data + y * pitch + x * bytesPerPixel, // src
+ pitch, // srcStride
+ w * bytesPerPixel, // stride
+ h); // num
bgfx::updateTexture2D(
tex->id
@@ -554,11 +558,11 @@ namespace
gl->th = handle;
}
- static void nvgRenderViewport(void* _userPtr, int width, int height, float devicePixelRatio)
+ static void nvgRenderViewport(void* _userPtr, float width, float height, float devicePixelRatio)
{
struct GLNVGcontext* gl = (struct GLNVGcontext*)_userPtr;
- gl->view[0] = (float)width;
- gl->view[1] = (float)height;
+ gl->view[0] = width;
+ gl->view[1] = height;
bgfx::setViewRect(gl->viewId, 0, 0, width * devicePixelRatio, height * devicePixelRatio);
}
@@ -758,12 +762,24 @@ namespace
if (gl->ncalls > 0)
{
- bgfx::allocTransientVertexBuffer(&gl->tvb, gl->nverts, s_nvgDecl);
+ int avail = bgfx::getAvailTransientVertexBuffer(gl->nverts, s_nvgLayout);
+ if (avail < gl->nverts)
+ {
+ gl->nverts = avail;
+ BX_WARN(true, "Vertex number truncated due to transient vertex buffer overflow");
+ if (gl->nverts < 2)
+ {
+ goto _cleanup;
+ }
+ }
+
+ bgfx::allocTransientVertexBuffer(&gl->tvb, gl->nverts, s_nvgLayout);
int allocated = gl->tvb.size/gl->tvb.stride;
if (allocated < gl->nverts)
{
+ // this branch should never be taken as we've already checked the transient vertex buffer size
gl->nverts = allocated;
BX_WARN(true, "Vertex number truncated due to transient vertex buffer overflow");
}
@@ -801,6 +817,7 @@ namespace
}
}
+_cleanup:
// Reset calls
gl->nverts = 0;
gl->npaths = 0;
@@ -1225,6 +1242,61 @@ NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* _ctx, int32_t _width, int32
return framebuffer;
}
+NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int32_t imageFlags, bgfx::ViewId viewId)
+{
+ NVGLUframebuffer* framebuffer = nvgluCreateFramebuffer(ctx, imageFlags);
+
+ if (framebuffer != NULL)
+ {
+ nvgluSetViewFramebuffer(viewId, framebuffer);
+ }
+
+ return framebuffer;
+}
+
+NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* _ctx, int32_t _imageFlags)
+{
+ BX_UNUSED(_imageFlags);
+ bgfx::TextureHandle textures[] =
+ {
+ bgfx::createTexture2D(bgfx::BackbufferRatio::Equal, false, 1, bgfx::TextureFormat::RGBA8, BGFX_TEXTURE_RT),
+ bgfx::createTexture2D(bgfx::BackbufferRatio::Equal, false, 1, bgfx::TextureFormat::D24S8, BGFX_TEXTURE_RT | BGFX_TEXTURE_RT_WRITE_ONLY)
+ };
+ bgfx::FrameBufferHandle fbh = bgfx::createFrameBuffer(
+ BX_COUNTOF(textures)
+ , textures
+ , true
+ );
+
+ if (!bgfx::isValid(fbh) )
+ {
+ return NULL;
+ }
+
+ struct NVGparams* params = nvgInternalParams(_ctx);
+ struct GLNVGcontext* gl = (struct GLNVGcontext*)params->userPtr;
+ struct GLNVGtexture* tex = glnvg__allocTexture(gl);
+
+ if (NULL == tex)
+ {
+ bgfx::destroy(fbh);
+ return NULL;
+ }
+
+ tex->width = 0;
+ tex->height = 0;
+ tex->type = NVG_TEXTURE_RGBA;
+ tex->flags = _imageFlags | NVG_IMAGE_PREMULTIPLIED;
+ tex->id = bgfx::getTexture(fbh);
+
+ NVGLUframebuffer* framebuffer = BX_NEW(gl->allocator, NVGLUframebuffer);
+ framebuffer->ctx = _ctx;
+ framebuffer->image = tex->id.idx;
+ framebuffer->handle = fbh;
+
+ return framebuffer;
+}
+
void nvgluBindFramebuffer(NVGLUframebuffer* _framebuffer)
{
static NVGcontext* s_prevCtx = NULL;
@@ -1265,3 +1337,19 @@ void nvgluSetViewFramebuffer(bgfx::ViewId _viewId, NVGLUframebuffer* _framebuffe
bgfx::setViewFrameBuffer(_viewId, _framebuffer->handle);
bgfx::setViewMode(_viewId, bgfx::ViewMode::Sequential);
}
+
+int nvgCreateBgfxTexture(struct NVGcontext *_ctx,
+ bgfx::TextureHandle _id,
+ int _width,
+ int _height,
+ int _flags) {
+ struct NVGparams *params = nvgInternalParams(_ctx);
+ struct GLNVGcontext *gl = (struct GLNVGcontext *)params->userPtr;
+ struct GLNVGtexture *tex = glnvg__allocTexture(gl);
+ tex->id = _id;
+ tex->width = _width;
+ tex->height = _height;
+ tex->flags = _flags;
+ tex->type = NVG_TEXTURE_RGBA;
+ return tex->id.idx;
+}