From f08ce4fdaaa1d6a98ca5b227a2d00d71a7901881 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Sat, 18 Jan 2014 23:43:16 -0800 Subject: [PATCH] Added 17-drawstress example. --- examples/17-drawstress/drawstress.cpp | 349 ++++++++++++++++++ examples/17-drawstress/fs_drawstress.sc | 13 + examples/17-drawstress/makefile | 17 + examples/17-drawstress/varying.def.sc | 4 + examples/17-drawstress/vs_drawstress.sc | 15 + examples/makefile | 1 + .../runtime/shaders/dx11/fs_drawstress.bin | Bin 0 -> 494 bytes .../runtime/shaders/dx11/vs_drawstress.bin | Bin 0 -> 1232 bytes .../runtime/shaders/dx9/fs_drawstress.bin | Bin 0 -> 137 bytes .../runtime/shaders/dx9/vs_drawstress.bin | Bin 0 -> 319 bytes .../runtime/shaders/gles/fs_drawstress.bin | Bin 0 -> 130 bytes .../runtime/shaders/gles/vs_drawstress.bin | Bin 0 -> 320 bytes .../runtime/shaders/glsl/fs_drawstress.bin | Bin 0 -> 77 bytes .../runtime/shaders/glsl/vs_drawstress.bin | Bin 0 -> 267 bytes premake/premake4.lua | 3 +- 15 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 examples/17-drawstress/drawstress.cpp create mode 100644 examples/17-drawstress/fs_drawstress.sc create mode 100644 examples/17-drawstress/makefile create mode 100644 examples/17-drawstress/varying.def.sc create mode 100644 examples/17-drawstress/vs_drawstress.sc create mode 100644 examples/runtime/shaders/dx11/fs_drawstress.bin create mode 100644 examples/runtime/shaders/dx11/vs_drawstress.bin create mode 100644 examples/runtime/shaders/dx9/fs_drawstress.bin create mode 100644 examples/runtime/shaders/dx9/vs_drawstress.bin create mode 100644 examples/runtime/shaders/gles/fs_drawstress.bin create mode 100644 examples/runtime/shaders/gles/vs_drawstress.bin create mode 100644 examples/runtime/shaders/glsl/fs_drawstress.bin create mode 100644 examples/runtime/shaders/glsl/vs_drawstress.bin diff --git a/examples/17-drawstress/drawstress.cpp b/examples/17-drawstress/drawstress.cpp new file mode 100644 index 00000000..9ff8a0e1 --- /dev/null +++ b/examples/17-drawstress/drawstress.cpp @@ -0,0 +1,349 @@ +/* + * Copyright 2011-2013 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "common.h" + +#include +#include +#include +#include "fpumath.h" +#include "imgui/imgui.h" + +#include +#include + +struct PosColorVertex +{ + float m_x; + float m_y; + float m_z; + uint32_t m_abgr; +}; + +static bgfx::VertexDecl s_PosColorDecl; + +static PosColorVertex s_cubeVertices[8] = +{ + {-1.0f, 1.0f, 1.0f, 0xff000000 }, + { 1.0f, 1.0f, 1.0f, 0xff0000ff }, + {-1.0f, -1.0f, 1.0f, 0xff00ff00 }, + { 1.0f, -1.0f, 1.0f, 0xff00ffff }, + {-1.0f, 1.0f, -1.0f, 0xffff0000 }, + { 1.0f, 1.0f, -1.0f, 0xffff00ff }, + {-1.0f, -1.0f, -1.0f, 0xffffff00 }, + { 1.0f, -1.0f, -1.0f, 0xffffffff }, +}; + +static const uint16_t s_cubeIndices[36] = +{ + 0, 1, 2, // 0 + 1, 3, 2, + 4, 6, 5, // 2 + 5, 6, 7, + 0, 2, 4, // 4 + 4, 2, 6, + 1, 5, 3, // 6 + 5, 7, 3, + 0, 4, 1, // 8 + 4, 5, 1, + 2, 3, 6, // 10 + 6, 3, 7, +}; + +static const char* s_shaderPath = NULL; + +static void shaderFilePath(char* _out, const char* _name) +{ + strcpy(_out, s_shaderPath); + strcat(_out, _name); + strcat(_out, ".bin"); +} + +long int fsize(FILE* _file) +{ + long int pos = ftell(_file); + fseek(_file, 0L, SEEK_END); + long int size = ftell(_file); + fseek(_file, pos, SEEK_SET); + return size; +} + +static const bgfx::Memory* load(const char* _filePath) +{ + FILE* file = fopen(_filePath, "rb"); + if (NULL != file) + { + uint32_t size = (uint32_t)fsize(file); + const bgfx::Memory* mem = bgfx::alloc(size+1); + size_t ignore = fread(mem->data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + mem->data[mem->size-1] = '\0'; + return mem; + } + + return NULL; +} + +static const bgfx::Memory* loadShader(const char* _name) +{ + char filePath[512]; + shaderFilePath(filePath, _name); + return load(filePath); +} + +int _main_(int /*_argc*/, char** /*_argv*/) +{ + uint32_t width = 1280; + uint32_t height = 720; + uint32_t debug = BGFX_DEBUG_TEXT; + uint32_t reset = BGFX_RESET_NONE; + + bgfx::init(); + bgfx::reset(width, height, reset); + + // Enable debug text. + bgfx::setDebug(debug); + + // Set view 0 clear state. + bgfx::setViewClear(0 + , BGFX_CLEAR_COLOR_BIT|BGFX_CLEAR_DEPTH_BIT + , 0x303030ff + , 1.0f + , 0 + ); + + // Setup root path for binary shaders. Shader binaries are different + // for each renderer. + switch (bgfx::getRendererType() ) + { + default: + case bgfx::RendererType::Direct3D9: + s_shaderPath = "shaders/dx9/"; + break; + + case bgfx::RendererType::Direct3D11: + s_shaderPath = "shaders/dx11/"; + break; + + case bgfx::RendererType::OpenGL: + s_shaderPath = "shaders/glsl/"; + break; + + case bgfx::RendererType::OpenGLES2: + case bgfx::RendererType::OpenGLES3: + s_shaderPath = "shaders/gles/"; + break; + } + + // Create vertex stream declaration. + s_PosColorDecl.begin(); + s_PosColorDecl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); + s_PosColorDecl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true); + s_PosColorDecl.end(); + + const bgfx::Memory* mem; + + // Create static vertex buffer. + mem = bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ); + bgfx::VertexBufferHandle vbh = bgfx::createVertexBuffer(mem, s_PosColorDecl); + + // Create static index buffer. + mem = bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ); + bgfx::IndexBufferHandle ibh = bgfx::createIndexBuffer(mem); + + // Load vertex shader. + mem = loadShader("vs_drawstress"); + bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem); + + // Load fragment shader. + mem = loadShader("fs_drawstress"); + bgfx::FragmentShaderHandle fsh = bgfx::createFragmentShader(mem); + + // Create program from shaders. + bgfx::ProgramHandle program = bgfx::createProgram(vsh, fsh); + + // We can destroy vertex and fragment shader here since + // their reference is kept inside bgfx after calling createProgram. + // Vertex and fragment shader will be destroyed once program is + // destroyed. + bgfx::destroyVertexShader(vsh); + bgfx::destroyFragmentShader(fsh); + + FILE* file = fopen("font/droidsans.ttf", "rb"); + uint32_t size = (uint32_t)fsize(file); + void* data = malloc(size); + size_t ignore = fread(data, 1, size, file); + BX_UNUSED(ignore); + fclose(file); + + imguiCreate(data, size); + + free(data); + + bool autoAdjust = true; + int32_t scrollArea = 0; + int32_t dim = 16; + uint32_t transform = 0; + + entry::MouseState mouseState; + + int64_t timeOffset = bx::getHPCounter(); + + int64_t deltaTimeNs = 0; + int64_t deltaTimeAvgNs = 0; + int64_t numFrames = 0; + + while (!entry::processEvents(width, height, debug, reset, &mouseState) ) + { + int64_t now = bx::getHPCounter(); + static int64_t last = now; + const int64_t frameTime = now - last; + last = now; + const double freq = double(bx::getHPFrequency() ); + const double toMs = 1000.0/freq; + + deltaTimeNs += frameTime*1000000/bx::getHPFrequency(); + + if (deltaTimeNs > 1000000) + { + deltaTimeAvgNs = deltaTimeNs / numFrames; + + if (autoAdjust) + { + if (deltaTimeAvgNs < 1000000/65) + { + dim = bx::uint32_min(dim + 2, 40); + } + else if (deltaTimeAvgNs > 1000000/57) + { + dim = bx::uint32_max(dim - 1, 5); + } + } + + deltaTimeNs = deltaTimeAvgNs; + numFrames = 1; + } + else + { + ++numFrames; + } + + float time = (float)( (now-timeOffset)/freq); + + imguiBeginFrame(mouseState.m_mx + , mouseState.m_my + , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) + | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) + , 0 + , width + , height + ); + + imguiBeginScrollArea("Settings", width - width / 4 - 10, 10, width / 4, height / 3, &scrollArea); + imguiSeparatorLine(); + + transform = imguiChoose(transform + , "Rotate" + , "No fragments" + ); + imguiSeparatorLine(); + + if (imguiCheck("Auto adjust", autoAdjust) ) + { + autoAdjust ^= true; + } + + imguiSlider("Dim", &dim, 5, 40); + imguiLabel("Draw calls: %d", dim*dim*dim); + imguiLabel("Avg Delta Time (1 second) [ms]: %0.4f", deltaTimeAvgNs/1000.0f); + + imguiEndScrollArea(); + imguiEndFrame(); + + float at[3] = { 0.0f, 0.0f, 0.0f }; + float eye[3] = { 0.0f, 0.0f, -35.0f }; + + float view[16]; + float proj[16]; + mtxLookAt(view, eye, at); + mtxProj(proj, 60.0f, float(width)/float(height), 0.1f, 100.0f); + + // Set view and projection matrix for view 0. + bgfx::setViewTransform(0, view, proj); + + // Set view 0 default viewport. + bgfx::setViewRect(0, 0, 0, width, height); + + // This dummy draw call is here to make sure that view 0 is cleared + // if no other draw calls are submitted to view 0. + bgfx::submit(0); + + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/xx-drawstress"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Draw stress, maximizing number of draw calls."); + bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); + + float mtxS[16]; + const float scale = 0 == transform ? 0.25f : 0.0f; + mtxScale(mtxS, scale, scale, scale); + + const float step = 0.6f; + float pos[3]; + pos[0] = -step*dim / 2.0f; + pos[1] = -step*dim / 2.0f; + pos[2] = -15.0; + + for (uint32_t zz = 0; zz < uint32_t(dim); ++zz) + { + for (uint32_t yy = 0; yy < uint32_t(dim); ++yy) + { + for (uint32_t xx = 0; xx < uint32_t(dim); ++xx) + { + float mtxR[16]; + mtxRotateXYZ(mtxR, time + xx*0.21f, time + yy*0.37f, time + yy*0.13f); + + float mtx[16]; + mtxMul(mtx, mtxS, mtxR); + + mtx[12] = pos[0] + float(xx)*step; + mtx[13] = pos[1] + float(yy)*step; + mtx[14] = pos[2] + float(zz)*step; + + // Set model matrix for rendering. + bgfx::setTransform(mtx); + + // Set vertex and fragment shaders. + bgfx::setProgram(program); + + // Set vertex and index buffer. + bgfx::setVertexBuffer(vbh); + bgfx::setIndexBuffer(ibh); + + // Set render states. + bgfx::setState(BGFX_STATE_DEFAULT); + + // Submit primitive for rendering to view 0. + bgfx::submit(0); + } + } + } + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx::frame(); + } + + // Cleanup. + bgfx::destroyIndexBuffer(ibh); + bgfx::destroyVertexBuffer(vbh); + bgfx::destroyProgram(program); + + // Shutdown bgfx. + bgfx::shutdown(); + + return 0; +} diff --git a/examples/17-drawstress/fs_drawstress.sc b/examples/17-drawstress/fs_drawstress.sc new file mode 100644 index 00000000..afc160fa --- /dev/null +++ b/examples/17-drawstress/fs_drawstress.sc @@ -0,0 +1,13 @@ +$input v_color0 + +/* + * Copyright 2011-2013 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_FragColor = v_color0; +} diff --git a/examples/17-drawstress/makefile b/examples/17-drawstress/makefile new file mode 100644 index 00000000..2733e50c --- /dev/null +++ b/examples/17-drawstress/makefile @@ -0,0 +1,17 @@ +# +# Copyright 2011-2013 Branimir Karadzic. All rights reserved. +# License: http://www.opensource.org/licenses/BSD-2-Clause +# + +BGFX_DIR=../.. +RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build + +include $(BGFX_DIR)/premake/shader.mk + +rebuild: + @make -s --no-print-directory TARGET=0 clean all + @make -s --no-print-directory TARGET=1 clean all + @make -s --no-print-directory TARGET=2 clean all + @make -s --no-print-directory TARGET=3 clean all + @make -s --no-print-directory TARGET=4 clean all diff --git a/examples/17-drawstress/varying.def.sc b/examples/17-drawstress/varying.def.sc new file mode 100644 index 00000000..9d9d83e5 --- /dev/null +++ b/examples/17-drawstress/varying.def.sc @@ -0,0 +1,4 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); + +vec3 a_position : POSITION; +vec4 a_color0 : COLOR0; diff --git a/examples/17-drawstress/vs_drawstress.sc b/examples/17-drawstress/vs_drawstress.sc new file mode 100644 index 00000000..6bfaaa9a --- /dev/null +++ b/examples/17-drawstress/vs_drawstress.sc @@ -0,0 +1,15 @@ +$input a_position, a_color0 +$output v_color0 + +/* + * Copyright 2011-2013 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + gl_Position = mul(u_modelViewProj, vec4(a_position, 1.0) ); + v_color0 = a_color0; +} diff --git a/examples/makefile b/examples/makefile index e5aabc5f..8497153e 100644 --- a/examples/makefile +++ b/examples/makefile @@ -20,5 +20,6 @@ rebuild: @make -s --no-print-directory rebuild -C 14-shadowvolumes @make -s --no-print-directory rebuild -C 15-shadowmaps-simple @make -s --no-print-directory rebuild -C 16-shadowmaps + @make -s --no-print-directory rebuild -C 17-drawstress @make -s --no-print-directory rebuild -C common/font @make -s --no-print-directory rebuild -C common/imgui diff --git a/examples/runtime/shaders/dx11/fs_drawstress.bin b/examples/runtime/shaders/dx11/fs_drawstress.bin new file mode 100644 index 0000000000000000000000000000000000000000..ff7b025e232f9a6d5d675b05d939783ef2c821cb GIT binary patch literal 494 zcmZ<@_F!Dn{oa#-f#E+8BZCW!E)h=7D`#B1?X_smzd0YDT+ms1Z5ty{$ps+63ZzYd zxCe+I0I>*AECh&yTwL7(fP7>i1LCm!|IaXyfdRz!%}g%JFV0UZQP2p|RPgW#_E8AV zNK8pBQgF`CEy&CPGA#9sEcGl+jr5ES4GkGquU_pL?C$3S)XN0K96)RV#2^524>Op> zz`zfrU7&0b1ri6z^8+P@2*!4kgUH(fof915 X7*Yb12l)dAkl7$Hkef*XM5_k?-uOS6 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx11/vs_drawstress.bin b/examples/runtime/shaders/dx11/vs_drawstress.bin new file mode 100644 index 0000000000000000000000000000000000000000..84ca4b95b81f111d8478d1e2de71da9e8ac2a076 GIT binary patch literal 1232 zcma)5&ubG=5S}%w-FPs)cxWl|1P}ERNc@2*MWcyn0GV*2pDnwGN+C0?6cG^!`<#g4b( zEqBGVbyF0}c3If1=91G9Id5&f?IOt})0t%EPC9ujl}hoMm+ZNDzB{~+y#4p!%5cpB zOC*TyD-e-!o;o&0lrzhwMHSO7RZHeP`6l$r=nd;JKhi^+{~7~%gKJmA zp3;7Wej1;I>MMK)_$4``a3$0q#oGn%{iM{CJV1t8lX_R_;*+Jj_}tYR3)ezz?7e1J ZA6C0O7tZTu<9o~dtW4pmJ}>?^|1X{;pT+RFl^=@}au8ZyW;Ffeg3 XFf=eQ@K0a_vKct|f$S#}z%~E?h@T;S literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_drawstress.bin b/examples/runtime/shaders/dx9/vs_drawstress.bin new file mode 100644 index 0000000000000000000000000000000000000000..d5a2d9c98f50b2335cd0127df30714768fb510a1 GIT binary patch literal 319 zcmWFw_F!Dn{oa$2fxk39H$NpcCoD6yJfJ8)i<6OofrUYak%9T&|9}6L8Jt5Lon#mo z7{Y-VBnFgb0Pz_b85jb9lmQSk0Wk{@I{+~Vpc%=)41_E|2+|7zWySHv@dgaOnaM@@ z#rbI^3K~J03LZYeJ_^AZi7BZ?3eNet1(`WOhNYg7rJkj!k)E-kp&^4j&?+tlh6V-( z{s|y9(5MEW58!N|_yd?4p!fq;po@WGKs8SmFfxQr0J;%~_<{OCe1-`?x&bD}1QuHb a76Td#()R!)&kRw^1TqiEpYZ=b&{hDRy+aQG literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/fs_drawstress.bin b/examples/runtime/shaders/gles/fs_drawstress.bin new file mode 100644 index 0000000000000000000000000000000000000000..26f66eb3825ad75c2de747be5469d68517a368fe GIT binary patch literal 130 zcmZ<@_F!Dn{oYeKGc6@GO~KtK-Zhx3peQvtvp6$9Paz{SJ)=M&Ehj&*#F|SvH7_MI zO+jBDs*I~Fv8XaLFI}N5HQ7X=EIv6uC%?$RnyV~7GesdcF*8p=LzAnTOF9U5Jh!6UoqfDUHHK6ic3+!g&?>Mu}$hon<+7^FZ=?3!~gRajE{zb735Y$v?n&WrDU671oa;nb@bp%gjq$$43=3Vc=lDVbt#A%pD> zTmU~zm*w6ehM^Ctckh5>9QM5DFFT&jKK(Z#CaG9{#lCCT)?@ca?7UFb{5Pgrbp>cV E0eX#Ub^rhX literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/fs_drawstress.bin b/examples/runtime/shaders/glsl/fs_drawstress.bin new file mode 100644 index 0000000000000000000000000000000000000000..693031755e1ddd134dcb771d8711cc45c2f8ab7d GIT binary patch literal 77 zcmZ<@_F!Dn{ob=Iv8XaLFI}N5HQ7X=EIv6uC%?$RnyV~7GesdcF*8p=LzAnTOF*=L%LDYHTks4B3sNWk)fYSPP;31c+wJ0nN10>N84 zp+QoAC~?UDSi;g-P(cu~D}zs`XU_ literal 0 HcmV?d00001 diff --git a/premake/premake4.lua b/premake/premake4.lua index 94c665a1..4ff662f9 100644 --- a/premake/premake4.lua +++ b/premake/premake4.lua @@ -162,7 +162,8 @@ exampleProject("12-lod", "0512e9e6-bfd8-11e2-8e34-0291bd4c8125") exampleProject("13-stencil", "d12d6522-37bc-11e3-b89c-e46428d43830") exampleProject("14-shadowvolumes", "d7eb4bcc-37bc-11e3-b7a4-e46428d43830") exampleProject("15-shadowmaps-simple", "a10f22ab-e0ee-471a-b2b6-2f6cb1c63fdc") -exampleProject("16-shadowmaps", "f9a91cb0-7b1b-11e3-981f-0800200c9a66") +exampleProject("16-shadowmaps", "f9a91cb0-7b1b-11e3-981f-0800200c9a66") +exampleProject("17-drawstress", "9aeea4c6-80dc-11e3-b3ca-4da6db0f677b") dofile "makedisttex.lua" dofile "shaderc.lua"