diff options
Diffstat (limited to '3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp | 108 |
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; +} |