diff --git a/Common/Data/Collections/FastVec.h b/Common/Data/Collections/FastVec.h index 3267347960..e649c36635 100644 --- a/Common/Data/Collections/FastVec.h +++ b/Common/Data/Collections/FastVec.h @@ -18,10 +18,10 @@ public: } ~FastVec() { if (data_) free(data_); } - T *push_back() { + T &push_uninitialized() { if (size_ < capacity_) { size_++; - return data_ + size_ - 1; + return data_[size_ - 1]; } else { T *oldData = data_; size_t newCapacity = capacity_ * 2; @@ -35,13 +35,13 @@ public: } size_++; capacity_ = newCapacity; - return data_ + size_ - 1; + return data_[size_ - 1]; } } void push_back(const T &t) { - T *dest = push_back(); - *dest = t; + T &dest = push_uninitialized(); + dest = t; } // Move constructor diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index 5d5ece924c..902475567c 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -256,37 +256,37 @@ public: // We pass in width/height here even though it's not strictly needed until we support glTextureStorage // and then we'll also need formats and stuff. GLRTexture *CreateTexture(GLenum target, int width, int height, int depth, int numMips) { - GLRInitStep step { GLRInitStepType::CREATE_TEXTURE }; + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::CREATE_TEXTURE; step.create_texture.texture = new GLRTexture(caps_, width, height, depth, numMips); step.create_texture.texture->target = target; - initSteps_.push_back(step); return step.create_texture.texture; } GLRBuffer *CreateBuffer(GLuint target, size_t size, GLuint usage) { - GLRInitStep step{ GLRInitStepType::CREATE_BUFFER }; + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::CREATE_BUFFER; step.create_buffer.buffer = new GLRBuffer(target, size); step.create_buffer.size = (int)size; step.create_buffer.usage = usage; - initSteps_.push_back(step); return step.create_buffer.buffer; } GLRShader *CreateShader(GLuint stage, const std::string &code, const std::string &desc) { - GLRInitStep step{ GLRInitStepType::CREATE_SHADER }; + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::CREATE_SHADER; step.create_shader.shader = new GLRShader(); step.create_shader.shader->desc = desc; step.create_shader.stage = stage; step.create_shader.code = new char[code.size() + 1]; memcpy(step.create_shader.code, code.data(), code.size() + 1); - initSteps_.push_back(step); return step.create_shader.shader; } GLRFramebuffer *CreateFramebuffer(int width, int height, bool z_stencil) { - GLRInitStep step{ GLRInitStepType::CREATE_FRAMEBUFFER }; + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::CREATE_FRAMEBUFFER; step.create_framebuffer.framebuffer = new GLRFramebuffer(caps_, width, height, z_stencil); - initSteps_.push_back(step); return step.create_framebuffer.framebuffer; } @@ -295,7 +295,8 @@ public: GLRProgram *CreateProgram( std::vector shaders, std::vector semantics, std::vector queries, std::vector initializers, GLRProgramLocData *locData, const GLRProgramFlags &flags) { - GLRInitStep step{ GLRInitStepType::CREATE_PROGRAM }; + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::CREATE_PROGRAM; _assert_(shaders.size() <= ARRAY_SIZE(step.create_program.shaders)); step.create_program.program = new GLRProgram(); step.create_program.program->semantics_ = semantics; @@ -319,18 +320,17 @@ public: } #endif step.create_program.num_shaders = (int)shaders.size(); - initSteps_.push_back(step); return step.create_program.program; } GLRInputLayout *CreateInputLayout(const std::vector &entries) { - GLRInitStep step{ GLRInitStepType::CREATE_INPUT_LAYOUT }; + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::CREATE_INPUT_LAYOUT; step.create_input_layout.inputLayout = new GLRInputLayout(); step.create_input_layout.inputLayout->entries = entries; for (auto &iter : step.create_input_layout.inputLayout->entries) { step.create_input_layout.inputLayout->semanticsMask_ |= 1 << iter.location; } - initSteps_.push_back(step); return step.create_input_layout.inputLayout; } @@ -403,7 +403,8 @@ public: void BufferSubdata(GLRBuffer *buffer, size_t offset, size_t size, uint8_t *data, bool deleteData = true) { // TODO: Maybe should be a render command instead of an init command? When possible it's better as // an init command, that's for sure. - GLRInitStep step(GLRInitStepType::BUFFER_SUBDATA); + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::BUFFER_SUBDATA; _dbg_assert_(offset >= 0); _dbg_assert_(offset <= buffer->size_ - size); step.buffer_subdata.buffer = buffer; @@ -411,12 +412,12 @@ public: step.buffer_subdata.size = (int)size; step.buffer_subdata.data = data; step.buffer_subdata.deleteData = deleteData; - initSteps_.push_back(step); } // Takes ownership over the data pointer and delete[]-s it. void TextureImage(GLRTexture *texture, int level, int width, int height, int depth, Draw::DataFormat format, uint8_t *data, GLRAllocType allocType = GLRAllocType::NEW, bool linearFilter = false) { - GLRInitStep step(GLRInitStepType::TEXTURE_IMAGE); + GLRInitStep &step = initSteps_.push_uninitialized(); + step.stepType = GLRInitStepType::TEXTURE_IMAGE; step.texture_image.texture = texture; step.texture_image.data = data; step.texture_image.format = format; @@ -426,7 +427,6 @@ public: step.texture_image.depth = depth; step.texture_image.allocType = allocType; step.texture_image.linearFilter = linearFilter; - initSteps_.push_back(step); } void TextureSubImage(int slot, GLRTexture *texture, int level, int x, int y, int width, int height, Draw::DataFormat format, uint8_t *data, GLRAllocType allocType = GLRAllocType::NEW) {