//[-------------------------------------------------------]
	//[ 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))
		}
	}
Exemple #2
0
	//[-------------------------------------------------------]
	//[ 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;
			}
		}
	}
Exemple #4
0
	/**
	*  @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
	}