void RenderTextureCore::initialize() { RenderTargetCore::initialize(); const RENDER_SURFACE_CORE_DESC& colorSurface = mDesc.colorSurface; if (colorSurface.texture != nullptr) { SPtr<TextureCore> texture = colorSurface.texture; if (texture->getProperties().getUsage() != TU_RENDERTARGET) BS_EXCEPT(InvalidParametersException, "Provided texture is not created with render target usage."); mColorSurface = TextureCore::requestView(texture, colorSurface.mipLevel, 1, colorSurface.face, colorSurface.numFaces, GVU_RENDERTARGET); } const RENDER_SURFACE_CORE_DESC& depthStencilSurface = mDesc.depthStencilSurface; if (depthStencilSurface.texture != nullptr) { SPtr<TextureCore> texture = depthStencilSurface.texture; if (texture->getProperties().getUsage() != TU_DEPTHSTENCIL) BS_EXCEPT(InvalidParametersException, "Provided texture is not created with depth stencil usage."); mDepthStencilSurface = TextureCore::requestView(texture, depthStencilSurface.mipLevel, 1, depthStencilSurface.face, 0, GVU_DEPTHSTENCIL); } throwIfBuffersDontMatch(); if (mColorSurface != nullptr) { assert(mColorSurface->getTexture() != nullptr); SPtr<TextureCore> colorTexture = mColorSurface->getTexture(); const TextureProperties& texProps = colorTexture->getProperties(); UINT32 numSlices; if (texProps.getTextureType() == TEX_TYPE_3D) numSlices = texProps.getDepth(); else numSlices = texProps.getNumFaces(); if ((mColorSurface->getFirstArraySlice() + mColorSurface->getNumArraySlices()) > numSlices) { BS_EXCEPT(InvalidParametersException, "Provided number of faces is out of range. Face: " + toString(mColorSurface->getFirstArraySlice() + mColorSurface->getNumArraySlices()) + ". Max num faces: " + toString(numSlices)); } if (mColorSurface->getMostDetailedMip() > texProps.getNumMipmaps()) { BS_EXCEPT(InvalidParametersException, "Provided number of mip maps is out of range. Mip level: " + toString(mColorSurface->getMostDetailedMip()) + ". Max num mipmaps: " + toString(texProps.getNumMipmaps())); } } }
void MultiRenderTextureCore::initialize() { RenderTargetCore::initialize(); mColorSurfaces.resize(BS_MAX_MULTIPLE_RENDER_TARGETS); for (size_t i = 0; i < mDesc.colorSurfaces.size(); i++) { if (mDesc.colorSurfaces[i].texture != nullptr) { if (i >= BS_MAX_MULTIPLE_RENDER_TARGETS) { LOGWRN("Render texture index is larger than the maximum number of supported render targets. Index: " + toString((int)i) + ". Max. number of render targets: " + toString(BS_MAX_MULTIPLE_RENDER_TARGETS)); continue; } SPtr<TextureCore> texture = mDesc.colorSurfaces[i].texture; if (texture->getProperties().getUsage() != TU_RENDERTARGET) BS_EXCEPT(InvalidParametersException, "Provided texture is not created with render target usage."); mColorSurfaces[i] = TextureCore::requestView(texture, mDesc.colorSurfaces[i].mipLevel, 1, mDesc.colorSurfaces[i].face, mDesc.colorSurfaces[i].numFaces, GVU_RENDERTARGET); } } if (mDesc.depthStencilSurface.texture != nullptr) { SPtr<TextureCore> texture = mDesc.depthStencilSurface.texture; if (texture->getProperties().getUsage() != TU_DEPTHSTENCIL) BS_EXCEPT(InvalidParametersException, "Provided texture is not created with depth stencil usage."); mDepthStencilSurface = TextureCore::requestView(texture, mDesc.depthStencilSurface.mipLevel, 1, mDesc.depthStencilSurface.face, 0, GVU_DEPTHSTENCIL); } throwIfBuffersDontMatch(); }