//[-------------------------------------------------------] //[ Private static Cg callback functions ] //[-------------------------------------------------------] void ShaderLanguageCg::cgErrorCallback() { const CGerror lastCgError = cgGetError(); if (CG_NO_ERROR != lastCgError) { // Output error message RENDERER_OUTPUT_DEBUG_PRINTF("OpenGL Cg error: %s\n", cgGetErrorString(lastCgError)) } }
//[-------------------------------------------------------] //[ Public methods ] //[-------------------------------------------------------] Framebuffer::Framebuffer(Direct3D11Renderer &direct3D11Renderer, uint32_t numberOfColorTextures, Renderer::ITexture **colorTextures, Renderer::ITexture *depthStencilTexture) : IFramebuffer(direct3D11Renderer), mNumberOfColorTextures(numberOfColorTextures), mColorTextures(nullptr), // Set below mDepthStencilTexture(depthStencilTexture), mWidth(UINT_MAX), mHeight(UINT_MAX), mD3D11RenderTargetViews(nullptr), mD3D11DepthStencilView(nullptr) { // The Direct3D 11 "ID3D11DeviceContext::OMSetRenderTargets method"-documentation at MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ff476464%28v=vs.85%29.aspx // says the following about the framebuffer width and height when using multiple render targets // "All render targets must have the same size in all dimensions (width and height, and depth for 3D or array size for *Array types)" // So, in here I use the smallest width and height as the size of the framebuffer and let Direct3D 11 handle the rest regarding errors. // Add a reference to the used color textures if (mNumberOfColorTextures > 0) { mColorTextures = new Renderer::ITexture*[mNumberOfColorTextures]; mD3D11RenderTargetViews = new ID3D11RenderTargetView*[mNumberOfColorTextures]; // Loop through all color textures ID3D11RenderTargetView **d3d11RenderTargetView = mD3D11RenderTargetViews; Renderer::ITexture **colorTexturesEnd = mColorTextures + mNumberOfColorTextures; for (Renderer::ITexture **colorTexture = mColorTextures; colorTexture < colorTexturesEnd; ++colorTexture, ++colorTextures, ++d3d11RenderTargetView) { // Valid entry? if (nullptr != *colorTextures) { // TODO(co) Add security check: Is the given resource one of the currently used renderer? *colorTexture = *colorTextures; (*colorTexture)->addReference(); // Evaluate the color texture type switch ((*colorTexture)->getResourceType()) { case Renderer::ResourceType::TEXTURE_2D: { // Update the framebuffer width and height if required Texture2D *texture2D = static_cast<Texture2D*>(*colorTexture); if (mWidth > texture2D->getWidth()) { mWidth = texture2D->getWidth(); } if (mHeight > texture2D->getHeight()) { mHeight = texture2D->getHeight(); } // Create the Direct3D 11 render target view instance D3D11_RENDER_TARGET_VIEW_DESC d3d11RenderTargetViewDesc = {}; d3d11RenderTargetViewDesc.Format = static_cast<DXGI_FORMAT>(Mapping::getDirect3D11Format(texture2D->getTextureFormat())); d3d11RenderTargetViewDesc.ViewDimension = (texture2D->getNumberOfMultisamples() > 1) ? D3D11_RTV_DIMENSION_TEXTURE2DMS : D3D11_RTV_DIMENSION_TEXTURE2D; d3d11RenderTargetViewDesc.Texture2D.MipSlice = 0; direct3D11Renderer.getD3D11Device()->CreateRenderTargetView(texture2D->getD3D11Texture2D(), &d3d11RenderTargetViewDesc, d3d11RenderTargetView); break; } case Renderer::ResourceType::ROOT_SIGNATURE: case Renderer::ResourceType::PROGRAM: case Renderer::ResourceType::VERTEX_ARRAY: case Renderer::ResourceType::SWAP_CHAIN: case Renderer::ResourceType::FRAMEBUFFER: case Renderer::ResourceType::INDEX_BUFFER: case Renderer::ResourceType::VERTEX_BUFFER: case Renderer::ResourceType::UNIFORM_BUFFER: case Renderer::ResourceType::TEXTURE_BUFFER: case Renderer::ResourceType::INDIRECT_BUFFER: case Renderer::ResourceType::TEXTURE_2D_ARRAY: case Renderer::ResourceType::PIPELINE_STATE: case Renderer::ResourceType::SAMPLER_STATE: case Renderer::ResourceType::VERTEX_SHADER: case Renderer::ResourceType::TESSELLATION_CONTROL_SHADER: case Renderer::ResourceType::TESSELLATION_EVALUATION_SHADER: case Renderer::ResourceType::GEOMETRY_SHADER: case Renderer::ResourceType::FRAGMENT_SHADER: default: RENDERER_OUTPUT_DEBUG_PRINTF("Direct3D 11 error: The type of the given color texture at index %d is not supported", colorTexture - colorTextures) *d3d11RenderTargetView = nullptr; break; } } else { *colorTexture = nullptr; *d3d11RenderTargetView = nullptr; } } } // Add a reference to the used depth stencil texture if (nullptr != mDepthStencilTexture) { mDepthStencilTexture->addReference(); // Evaluate the depth stencil texture type switch (mDepthStencilTexture->getResourceType()) { case Renderer::ResourceType::TEXTURE_2D: { // Update the framebuffer width and height if required Texture2D *texture2D = static_cast<Texture2D*>(mDepthStencilTexture); if (mWidth > texture2D->getWidth()) { mWidth = texture2D->getWidth(); } if (mHeight > texture2D->getHeight()) { mHeight = texture2D->getHeight(); } // Create the Direct3D 11 render target view instance D3D11_DEPTH_STENCIL_VIEW_DESC d3d11DepthStencilViewDesc = {}; d3d11DepthStencilViewDesc.Format = static_cast<DXGI_FORMAT>(Mapping::getDirect3D11Format(texture2D->getTextureFormat())); d3d11DepthStencilViewDesc.ViewDimension = (texture2D->getNumberOfMultisamples() > 1) ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D; d3d11DepthStencilViewDesc.Texture2D.MipSlice = 0; direct3D11Renderer.getD3D11Device()->CreateDepthStencilView(texture2D->getD3D11Texture2D(), &d3d11DepthStencilViewDesc, &mD3D11DepthStencilView); break; } case Renderer::ResourceType::ROOT_SIGNATURE: case Renderer::ResourceType::PROGRAM: case Renderer::ResourceType::VERTEX_ARRAY: case Renderer::ResourceType::SWAP_CHAIN: case Renderer::ResourceType::FRAMEBUFFER: case Renderer::ResourceType::INDEX_BUFFER: case Renderer::ResourceType::VERTEX_BUFFER: case Renderer::ResourceType::UNIFORM_BUFFER: case Renderer::ResourceType::TEXTURE_BUFFER: case Renderer::ResourceType::INDIRECT_BUFFER: case Renderer::ResourceType::TEXTURE_2D_ARRAY: case Renderer::ResourceType::PIPELINE_STATE: case Renderer::ResourceType::SAMPLER_STATE: case Renderer::ResourceType::VERTEX_SHADER: case Renderer::ResourceType::TESSELLATION_CONTROL_SHADER: case Renderer::ResourceType::TESSELLATION_EVALUATION_SHADER: case Renderer::ResourceType::GEOMETRY_SHADER: case Renderer::ResourceType::FRAGMENT_SHADER: default: RENDERER_OUTPUT_DEBUG_STRING("Direct3D 11 error: The type of the given depth stencil texture is not supported") break; } }
//[-------------------------------------------------------] //[ Public methods ] //[-------------------------------------------------------] TextureCollection::TextureCollection(Direct3D10Renderer &direct3D10Renderer, unsigned int numberOfTextures, Renderer::ITexture **textures) : Renderer::ITextureCollection(direct3D10Renderer), mNumberOfD3D10ShaderResourceViews(numberOfTextures), mD3D10ShaderResourceViews((numberOfTextures > 0) ? new ID3D10ShaderResourceView*[numberOfTextures] : nullptr), mTextures((numberOfTextures > 0) ? new Renderer::ITexture*[numberOfTextures] : nullptr) { // Loop through all given textures and gather the Direct3D 10 shader resource views ID3D10ShaderResourceView **currentD3D10ShaderResourceView = mD3D10ShaderResourceViews; Renderer::ITexture **currentTexture = mTextures; Renderer::ITexture **textureEnd = mTextures + mNumberOfD3D10ShaderResourceViews; for (; currentTexture < textureEnd; ++currentD3D10ShaderResourceView, ++currentTexture, ++textures) { // Get the current texture Renderer::ITexture *texture = *textures; // Add a texture reference texture->addReference(); *currentTexture = texture; // Security check: Is the given resource owned by this renderer? #ifndef DIRECT3D10RENDERER_NO_RENDERERMATCHCHECK if (&direct3D10Renderer != &texture->getRenderer()) { // Output an error message and keep on going in order to keep a resonable behaviour even in case on an error RENDERER_OUTPUT_DEBUG_PRINTF("Direct3D 10 error: The given resource at index %d is owned by another renderer instance", currentTexture - mTextures) *currentD3D10ShaderResourceView = nullptr; continue; } #endif // Evaluate the texture in order to get the Direct3D 10 shader resource view switch (texture->getResourceType()) { case Renderer::ResourceType::TEXTURE_BUFFER: *currentD3D10ShaderResourceView = static_cast<TextureBuffer*>(texture)->getD3D10ShaderResourceView(); break; case Renderer::ResourceType::TEXTURE_2D: *currentD3D10ShaderResourceView = static_cast<Texture2D*>(texture)->getD3D10ShaderResourceView(); break; case Renderer::ResourceType::TEXTURE_2D_ARRAY: *currentD3D10ShaderResourceView = static_cast<Texture2DArray*>(texture)->getD3D10ShaderResourceView(); break; case Renderer::ResourceType::PROGRAM: case Renderer::ResourceType::VERTEX_ARRAY: case Renderer::ResourceType::SWAP_CHAIN: case Renderer::ResourceType::FRAMEBUFFER: case Renderer::ResourceType::INDEX_BUFFER: case Renderer::ResourceType::VERTEX_BUFFER: case Renderer::ResourceType::UNIFORM_BUFFER: case Renderer::ResourceType::RASTERIZER_STATE: case Renderer::ResourceType::DEPTH_STENCIL_STATE: case Renderer::ResourceType::BLEND_STATE: case Renderer::ResourceType::SAMPLER_STATE: case Renderer::ResourceType::VERTEX_SHADER: case Renderer::ResourceType::TESSELLATION_CONTROL_SHADER: case Renderer::ResourceType::TESSELLATION_EVALUATION_SHADER: case Renderer::ResourceType::GEOMETRY_SHADER: case Renderer::ResourceType::FRAGMENT_SHADER: case Renderer::ResourceType::TEXTURE_COLLECTION: case Renderer::ResourceType::SAMPLER_STATE_COLLECTION: default: // Not handled in here break; } } }
/** * @brief * Debug message callback function called by the "GL_ARB_debug_output"-extension */ void ContextWindows::debugMessageCallback(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, int, const char *message, void *) { // Source to string char debugSource[16]; switch (source) { case GL_DEBUG_SOURCE_API_ARB: strncpy(debugSource, "OpenGL", 7); break; case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: strncpy(debugSource, "Windows", 8); break; case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: strncpy(debugSource, "Shader compiler", 16); break; case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: strncpy(debugSource, "Third party", 12); break; case GL_DEBUG_SOURCE_APPLICATION_ARB: strncpy(debugSource, "Application", 12); break; case GL_DEBUG_SOURCE_OTHER_ARB: strncpy(debugSource, "Other", 6); break; default: strncpy(debugSource, "?", 1); break; } // Debug type to string char debugType[20]; switch (type) { case GL_DEBUG_TYPE_ERROR_ARB: strncpy(debugType, "Error", 6); break; case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: strncpy(debugType, "Deprecated behavior", 20); break; case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: strncpy(debugType, "Undefined behavior", 19); break; case GL_DEBUG_TYPE_PORTABILITY_ARB: strncpy(debugType, "Portability", 12); break; case GL_DEBUG_TYPE_PERFORMANCE_ARB: strncpy(debugType, "Performance", 12); break; case GL_DEBUG_TYPE_OTHER_ARB: strncpy(debugType, "Other", 6); break; default: strncpy(debugType, "?", 1); break; } // Debug severity to string char debugSeverity[7]; switch (severity) { case GL_DEBUG_SEVERITY_HIGH_ARB: strncpy(debugSeverity, "High", 5); break; case GL_DEBUG_SEVERITY_MEDIUM_ARB: strncpy(debugSeverity, "Medium", 7); break; case GL_DEBUG_SEVERITY_LOW_ARB: strncpy(debugSeverity, "Low", 3); break; default: strncpy(debugType, "?", 1); break; } // Output the debug message #ifdef _DEBUG RENDERER_OUTPUT_DEBUG_PRINTF("OpenGL error: OpenGL debug message\tSource:\"%s\"\tType:\"%s\"\tID:\"%d\"\tSeverity:\"%s\"\tMessage:\"%s\"\n", debugSource, debugType, id, debugSeverity, message) #else // Avoid "warning C4100: '<x>' : unreferenced formal parameter"-warning id = id; message = message; #endif }