From f5295b951d28cdd80c312e22c7567a585a76b492 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Mon, 8 Oct 2012 23:24:10 -0700 Subject: [PATCH] Added instancing example. --- examples/01-cubes/cubes.cpp | 6 +- examples/03-raymarch/raymarch.cpp | 18 +- examples/05-instancing/fs_instancing.sc | 13 + examples/05-instancing/instancing.cpp | 266 ++++++++++++++++++ examples/05-instancing/makefile | 9 + examples/05-instancing/varying.def.sc | 9 + examples/05-instancing/vs_instancing.sc | 22 ++ .../runtime/shaders/dx11/fs_instancing.bin | Bin 0 -> 485 bytes .../runtime/shaders/dx11/vs_instancing.bin | Bin 0 -> 1394 bytes .../runtime/shaders/dx9/fs_instancing.bin | Bin 0 -> 129 bytes .../runtime/shaders/dx9/vs_instancing.bin | Bin 0 -> 466 bytes .../runtime/shaders/gles/fs_instancing.bin | Bin 0 -> 122 bytes .../runtime/shaders/gles/vs_instancing.bin | Bin 0 -> 556 bytes .../runtime/shaders/glsl/fs_instancing.bin | Bin 0 -> 83 bytes .../runtime/shaders/glsl/vs_instancing.bin | Bin 0 -> 517 bytes premake/example-05-instancing.lua | 43 +++ premake/premake4.lua | 1 + src/bgfx_shader.sh | 10 + src/renderer_d3d11.cpp | 64 +++-- tools/bin/shaderc.exe | Bin 1077248 -> 1077760 bytes tools/shaderc.cpp | 3 +- 21 files changed, 432 insertions(+), 32 deletions(-) create mode 100644 examples/05-instancing/fs_instancing.sc create mode 100644 examples/05-instancing/instancing.cpp create mode 100644 examples/05-instancing/makefile create mode 100644 examples/05-instancing/varying.def.sc create mode 100644 examples/05-instancing/vs_instancing.sc create mode 100644 examples/runtime/shaders/dx11/fs_instancing.bin create mode 100644 examples/runtime/shaders/dx11/vs_instancing.bin create mode 100644 examples/runtime/shaders/dx9/fs_instancing.bin create mode 100644 examples/runtime/shaders/dx9/vs_instancing.bin create mode 100644 examples/runtime/shaders/gles/fs_instancing.bin create mode 100644 examples/runtime/shaders/gles/vs_instancing.bin create mode 100644 examples/runtime/shaders/glsl/fs_instancing.bin create mode 100644 examples/runtime/shaders/glsl/vs_instancing.bin create mode 100644 premake/example-05-instancing.lua diff --git a/examples/01-cubes/cubes.cpp b/examples/01-cubes/cubes.cpp index 39ec68c1..edb47ac4 100644 --- a/examples/01-cubes/cubes.cpp +++ b/examples/01-cubes/cubes.cpp @@ -205,10 +205,10 @@ int _main_(int _argc, char** _argv) float time = (float)(bx::getHPCounter()/double(bx::getHPFrequency() ) ); - // Submit 10x10 cubes. - for (uint32_t yy = 0; yy <= 10; ++yy) + // Submit 11x11 cubes. + for (uint32_t yy = 0; yy < 11; ++yy) { - for (uint32_t xx = 0; xx <= 10; ++xx) + for (uint32_t xx = 0; xx < 11; ++xx) { float mtx[16]; mtxRotateXY(mtx, time + xx*0.21f, time + yy*0.37f); diff --git a/examples/03-raymarch/raymarch.cpp b/examples/03-raymarch/raymarch.cpp index f39cb51b..f08b503b 100644 --- a/examples/03-raymarch/raymarch.cpp +++ b/examples/03-raymarch/raymarch.cpp @@ -283,16 +283,14 @@ int _main_(int _argc, char** _argv) , time*0.37f ); - { - float mtxInv[16]; - mtxInverse(mtxInv, mtx); - float lightDirModel[4] = { -0.4f, -0.5f, -1.0f, 0.0f }; - float lightDirModelN[4]; - vec3Norm(lightDirModelN, lightDirModel); - float lightDir[4]; - vec4MulMtx(lightDir, lightDirModelN, mtxInv); - bgfx::setUniform(u_lightDir, lightDir); - } + float mtxInv[16]; + mtxInverse(mtxInv, mtx); + float lightDirModel[4] = { -0.4f, -0.5f, -1.0f, 0.0f }; + float lightDirModelN[4]; + vec3Norm(lightDirModelN, lightDirModel); + float lightDir[4]; + vec4MulMtx(lightDir, lightDirModelN, mtxInv); + bgfx::setUniform(u_lightDir, lightDir); float mvp[16]; mtxMul(mvp, mtx, vp); diff --git a/examples/05-instancing/fs_instancing.sc b/examples/05-instancing/fs_instancing.sc new file mode 100644 index 00000000..c74f1495 --- /dev/null +++ b/examples/05-instancing/fs_instancing.sc @@ -0,0 +1,13 @@ +$input v_color0 + +/* + * Copyright 2011-2012 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/05-instancing/instancing.cpp b/examples/05-instancing/instancing.cpp new file mode 100644 index 00000000..6c5a204f --- /dev/null +++ b/examples/05-instancing/instancing.cpp @@ -0,0 +1,266 @@ +/* + * Copyright 2011-2012 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include +#include +#include +#include "../common/dbg.h" +#include "../common/math.h" + +#include +#include + +void fatalCb(bgfx::Fatal::Enum _code, const char* _str) +{ + DBG("%x: %s", _code, _str); +} + +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, 2, 1, // 0 + 1, 2, 3, + 4, 5, 6, // 2 + 5, 7, 6, + 0, 4, 2, // 4 + 4, 6, 2, + 1, 3, 5, // 6 + 5, 3, 7, + 0, 1, 4, // 8 + 4, 1, 5, + 2, 6, 3, // 10 + 6, 7, 3, +}; + +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, const char* _default = NULL) +{ + char filePath[512]; + shaderFilePath(filePath, _name); + BX_UNUSED(_default); + return load(filePath); +} + +int _main_(int _argc, char** _argv) +{ + bgfx::init(BX_PLATFORM_WINDOWS, fatalCb); + bgfx::reset(1280, 720); + + // Enable debug text. + bgfx::setDebug(BGFX_DEBUG_TEXT); + + // Set view 0 default viewport. + bgfx::setViewRect(0, 0, 0, 1280, 720); + + // 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() ) + { + case bgfx::RendererType::Null: + 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: + 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_instancing"); + bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem); + + // Load fragment shader. + mem = loadShader("fs_instancing"); + 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); + + while (true) + { + // 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); + + 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; + + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/05-instancing"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Geometry instancing."); + bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); + + 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, 16.0f/9.0f, 0.1f, 100.0f); + + // Set view and projection matrix for view 0. + bgfx::setViewTransform(0, view, proj); + + float time = (float)(bx::getHPCounter()/double(bx::getHPFrequency() ) ); + + const uint16_t instanceStride = 80; + const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(121, instanceStride); + uint8_t* data = idb->data; + + // Write instance data for 11x11 cubes. + for (uint32_t yy = 0; yy < 11; ++yy) + { + for (uint32_t xx = 0; xx < 11; ++xx) + { + float* mtx = (float*)data; + mtxRotateXY(mtx, time + xx*0.21f, time + yy*0.37f); + mtx[12] = -15.0f + float(xx)*3.0f; + mtx[13] = -15.0f + float(yy)*3.0f; + mtx[14] = 0.0f; + + float* color = (float*)&data[64]; + color[0] = sin(time+float(xx)/11.0f)*0.5f+0.5f; + color[1] = cos(time+float(yy)/11.0f)*0.5f+0.5f; + color[2] = sin(time*3.0f)*0.5f+0.5f; + color[3] = 1.0f; + + data += instanceStride; + } + } + + // Set vertex and fragment shaders. + bgfx::setProgram(program); + + // Set vertex and index buffer. + bgfx::setVertexBuffer(vbh); + bgfx::setIndexBuffer(ibh); + + // Set instance data buffer. + bgfx::setInstanceDataBuffer(idb); + + // Set render states. + bgfx::setState(BGFX_STATE_RGB_WRITE + |BGFX_STATE_DEPTH_WRITE + |BGFX_STATE_DEPTH_TEST_LESS + ); + + // 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/05-instancing/makefile b/examples/05-instancing/makefile new file mode 100644 index 00000000..900aad91 --- /dev/null +++ b/examples/05-instancing/makefile @@ -0,0 +1,9 @@ +# +# Copyright 2011-2012 Branimir Karadzic. All rights reserved. +# License: http://www.opensource.org/licenses/BSD-2-Clause +# + +BGFX_DIR=../.. +RUNTIME_DIR=$(BGFX_DIR)/examples/runtime + +include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/05-instancing/varying.def.sc b/examples/05-instancing/varying.def.sc new file mode 100644 index 00000000..7a1bc5dc --- /dev/null +++ b/examples/05-instancing/varying.def.sc @@ -0,0 +1,9 @@ +vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0); + +vec3 a_position : POSITION; +vec4 a_color : COLOR0; +vec4 i_data0 : TEXCOORD3; +vec4 i_data1 : TEXCOORD4; +vec4 i_data2 : TEXCOORD5; +vec4 i_data3 : TEXCOORD6; +vec4 i_data4 : TEXCOORD7; diff --git a/examples/05-instancing/vs_instancing.sc b/examples/05-instancing/vs_instancing.sc new file mode 100644 index 00000000..62223595 --- /dev/null +++ b/examples/05-instancing/vs_instancing.sc @@ -0,0 +1,22 @@ +$input a_position, a_color, i_data0, i_data1, i_data2, i_data3, i_data4 +$output v_color0 + +/* + * Copyright 2011-2012 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +void main() +{ + mat4 model; + model[0] = i_data0; + model[1] = i_data1; + model[2] = i_data2; + model[3] = i_data3; + + vec4 worldPos = instMul(model, vec4(a_position, 1.0) ); + gl_Position = mul(u_viewProj, worldPos); + v_color0 = a_color*i_data4; +} diff --git a/examples/runtime/shaders/dx11/fs_instancing.bin b/examples/runtime/shaders/dx11/fs_instancing.bin new file mode 100644 index 0000000000000000000000000000000000000000..9e1a0eac8154c3694610bdf35b0d104cdb50ccfe GIT binary patch literal 485 zcmZQz_|Jd}E-<=8I61GJaq+g-qB;NOe0*|2XX&+Vj6g*ffCMX$HUZ)uAbtSEB0#Ya zAP#bIbqfIUk%0_|!}9+>!$bxK5ZgC1xhTIlKdnSTBS=%h!zb8BAvhy3CACPwIX|}` zGY819)HAZwvotl*Gd46dWLUj=wP&!qpAS$k6A*I%u>}x=0LVSeU={-dKah5TvOyF` z93;;Vln4%s5AYB64Ds~$V{rEO@ecwT>JKzi2dV~SrUDSd0J51ty&;Z4?yey~J;5F> zK_I&wfS3=6lLQ!;KM4qc?MVe%`AIz((nzMPbof4=>-{C)k$!$bn7?34(;as&1a!iRGpOCn#BB5q@~ z`3@T6S}?AcV3ItU$s3U|gxmBNfU(4twXy$bYrH367&0~k+k{Ot06c4W4V)+%-@;mh zPh(lCUx$7OzXl^zUx7Y>UxN{<-(^0NYhHJ#Ezmci9WK!0sYkZDN4nwciaF3%mO-O*42PnJw+5(I37$9{}EJi;06rA~#vlivNOF4U2 z&VH4%$EUbsYQ;I3YskFt$#>8mbE3D*RN|Q4g?MdVE=GM;L~^>9Hnnk&=bGo^*!h^F zi>K#Vm&Snpy+bwTVZFFN%R5+8FJ;b~xo{u(^SZC|V(zr5nfZ8jQ52(dX}a}dd7x^h79ry3`|@M3=Iqn{1X^~ OYz7W~Ap6M#unhpzE*>-h literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/dx9/vs_instancing.bin b/examples/runtime/shaders/dx9/vs_instancing.bin new file mode 100644 index 0000000000000000000000000000000000000000..84bd5828b9f645768daa8f7e292bf5c375a620d8 GIT binary patch literal 466 zcmY*Uu};G<6ui_WWi@}0Pv~5Jfse`H z?`XJ(+Z3#vaz5L4_dN99vqe7pxGIaMJrB_M_Mq0yx;ez;=IneQKuU9%*<2J(B!J-Qcy_GiFYeXOm_y!E7&5b JtmWcj005JuCaeGe literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/gles/vs_instancing.bin b/examples/runtime/shaders/gles/vs_instancing.bin new file mode 100644 index 0000000000000000000000000000000000000000..be3c2945ebf211593277faa2eb7f3324e52b58ec GIT binary patch literal 556 zcmZ{hKTpFj5XG7ODNgE=FtkmREn-A043!uWvP^8JhY~w-os@$3?i{g;`J-&-pP&8i z-K|hdrQz|L>U_mYU_IFg|A@b6ROkR*_WD4 z!ky8yFsY`3i8r>hZd)_qy~F3xt8jr_3NNY!UM}$60xuT$e_s(A`lByF@WCF@Q*KIN zQBp26kmc;1LCDx!sX9(hbPna?_6cqvBq687i^PBFcZpMyq%RYv*Xp$N2 literal 0 HcmV?d00001 diff --git a/examples/runtime/shaders/glsl/vs_instancing.bin b/examples/runtime/shaders/glsl/vs_instancing.bin new file mode 100644 index 0000000000000000000000000000000000000000..7dc59ffe811032bbeb5fca80f48c65c02ab6ba10 GIT binary patch literal 517 zcmZ{hO%8%E5QSa$6qC3C7Y2l#@eb~dX)07R1}LeeipIM;(rWz)yXn{0zIiiKEAiL-r)A?ZbW|#g-^fLg!q2gSetRenderState(D3DRS_SCISSORTESTENABLE, FALSE) ); } - void setInputLayout(const VertexDecl& _vertexDecl, const Program& _program) + void setInputLayout(const VertexDecl& _vertexDecl, const Program& _program, uint8_t _numInstanceData) { uint64_t layoutHash = (uint64_t(_vertexDecl.m_hash)<<32) | _program.m_vsh->m_hash; + layoutHash ^= _numInstanceData; ID3D11InputLayout* layout = m_inputLayoutCache.find(layoutHash); if (NULL == layout) { @@ -560,8 +561,41 @@ namespace bgfx decl.m_attributes[ii] = attr == 0 ? 0xff : attr == 0xff ? 0 : attr; } + D3D11_INPUT_ELEMENT_DESC* elem = fillVertexDecl(vertexElements, Attrib::Count, decl); ptrdiff_t num = elem-vertexElements; + + const D3D11_INPUT_ELEMENT_DESC inst = { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }; + + for (uint32_t ii = 0; ii < _numInstanceData; ++ii) + { + uint32_t index = 8-_numInstanceData+ii; + + uint32_t jj; + D3D11_INPUT_ELEMENT_DESC* curr; + for (jj = 0; jj < (uint32_t)num; ++jj) + { + curr = &vertexElements[jj]; + if (0 == strcmp(curr->SemanticName, "TEXCOORD") + && curr->SemanticIndex == index) + { + break; + } + } + + if (jj == num) + { + curr = elem; + ++elem; + } + + memcpy(curr, &inst, sizeof(D3D11_INPUT_ELEMENT_DESC) ); + curr->InputSlot = 1; + curr->SemanticIndex = index; + curr->AlignedByteOffset = ii*16; + } + + num = elem-vertexElements; DX_CHECK(m_device->CreateInputLayout(vertexElements , uint32_t(num) , _program.m_vsh->m_code->data @@ -971,7 +1005,7 @@ namespace bgfx uint32_t stride = vertexDecl.m_stride; uint32_t offset = 0; deviceCtx->IASetVertexBuffers(0, 1, &vb.m_ptr, &stride, &offset); - s_renderCtx.setInputLayout(vertexDecl, program); + s_renderCtx.setInputLayout(vertexDecl, program, 0); IndexBuffer& ib = s_renderCtx.m_indexBuffers[m_ib->handle.idx]; deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0); @@ -1070,7 +1104,7 @@ namespace bgfx s_renderCtx.m_vertexBuffers[m_vb->handle.idx].update(0, 4*m_decl.m_stride, m_vb->data); deviceCtx->IASetVertexBuffers(0, 1, &vb.m_ptr, &stride, &offset); - s_renderCtx.setInputLayout(vertexDecl, program); + s_renderCtx.setInputLayout(vertexDecl, program, 0); IndexBuffer& ib = s_renderCtx.m_indexBuffers[m_ib.idx]; deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0); @@ -2110,24 +2144,18 @@ namespace bgfx uint32_t stride = vertexDecl.m_stride; uint32_t offset = 0; deviceCtx->IASetVertexBuffers(0, 1, &vb.m_ptr, &stride, &offset); - s_renderCtx.setInputLayout(vertexDecl, s_renderCtx.m_program[programIdx]); if (invalidHandle != state.m_instanceDataBuffer.idx) { -// const VertexBuffer& inst = s_renderCtx.m_vertexBuffers[state.m_instanceDataBuffer.idx]; -// DX_CHECK(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA|state.m_numInstances) ); -// DX_CHECK(device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA|1) ); -// DX_CHECK(device->SetStreamSource(1, inst.m_ptr, state.m_instanceDataOffset, state.m_instanceDataStride) ); -// -// IDirect3DVertexDeclaration9* ptr = createVertexDecl(vertexDecl.m_decl, state.m_instanceDataStride/16); -// DX_CHECK(device->SetVertexDeclaration(ptr) ); -// DX_RELEASE(ptr, 0); + const VertexBuffer& inst = s_renderCtx.m_vertexBuffers[state.m_instanceDataBuffer.idx]; + uint32_t instStride = state.m_instanceDataStride; + deviceCtx->IASetVertexBuffers(1, 1, &inst.m_ptr, &instStride, &state.m_instanceDataOffset); + s_renderCtx.setInputLayout(vertexDecl, s_renderCtx.m_program[programIdx], state.m_instanceDataStride/16); } else { -// DX_CHECK(device->SetStreamSourceFreq(0, 1) ); -// DX_CHECK(device->SetStreamSource(1, NULL, 0, 0) ); -// DX_CHECK(device->SetVertexDeclaration(vertexDecl.m_ptr) ); + deviceCtx->IASetVertexBuffers(1, 0, NULL, NULL, NULL); + s_renderCtx.setInputLayout(vertexDecl, s_renderCtx.m_program[programIdx], 0); } } else @@ -2177,7 +2205,7 @@ namespace bgfx numInstances = state.m_numInstances; numPrimsRendered = numPrimsSubmitted*state.m_numInstances; - deviceCtx->DrawIndexed(numIndices, 0, state.m_startVertex); + deviceCtx->DrawIndexedInstanced(numIndices, state.m_numInstances, 0, state.m_startVertex, 0); } else if (primNumVerts <= state.m_numIndices) { @@ -2186,7 +2214,7 @@ namespace bgfx numInstances = state.m_numInstances; numPrimsRendered = numPrimsSubmitted*state.m_numInstances; - deviceCtx->DrawIndexed(numIndices, state.m_startIndex, state.m_startVertex); + deviceCtx->DrawIndexedInstanced(numIndices, state.m_numInstances, state.m_startIndex, state.m_startVertex, 0); } } else @@ -2195,7 +2223,7 @@ namespace bgfx numInstances = state.m_numInstances; numPrimsRendered = numPrimsSubmitted*state.m_numInstances; - deviceCtx->Draw(numVertices, state.m_startVertex); + deviceCtx->DrawInstanced(numVertices, state.m_numInstances, state.m_startVertex, 0); } statsNumPrimsSubmitted += numPrimsSubmitted; diff --git a/tools/bin/shaderc.exe b/tools/bin/shaderc.exe index 2d522b55d36df0145e0e89d4891e3b356b45b9a0..335349361fd13b526a46485c82aa08644081498a 100644 GIT binary patch delta 33429 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

^c7--y7Mr=NaWC=@=5jaD50}N3 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 RS65Z0np+-k8FeA{zW`k*G35XN delta 33150 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 W;-n#AO?IX`bDXS#%AF$aHu+zCx0aXy diff --git a/tools/shaderc.cpp b/tools/shaderc.cpp index 2ba548d7..88a21b53 100644 --- a/tools/shaderc.cpp +++ b/tools/shaderc.cpp @@ -1571,7 +1571,8 @@ int main(int _argc, const char* _argv[]) { const Varying& var = varyingIt->second; const char* name = var.m_name.c_str(); - if (0 == strncmp(name, "a_", 2) ) + if (0 == strncmp(name, "a_", 2) + || 0 == strncmp(name, "i_", 2) ) { preprocessor.writef("attribute %s %s;\n", var.m_type.c_str(), name); }