예제 #1
0
	OGLESTexture::OGLESTexture(TextureType type, uint32_t array_size, uint32_t sample_count, uint32_t sample_quality, uint32_t access_hint)
					: Texture(type, sample_count, sample_quality, access_hint),
						hw_res_ready_(false)
	{
		array_size_ = array_size;

		if ((array_size > 1) && !glloader_GLES_VERSION_3_0())
		{
			THR(errc::function_not_supported);
		}

		switch (type_)
		{
		case TT_1D:
		case TT_2D:
			if (array_size > 1)
			{
				target_type_ = GL_TEXTURE_2D_ARRAY;
			}
			else
			{
				target_type_ = GL_TEXTURE_2D;
			}
			break;

		case TT_3D:
			if (!glloader_GLES_VERSION_3_0() && !glloader_GLES_OES_texture_3D())
			{
				THR(errc::function_not_supported);
			}
			if (glloader_GLES_VERSION_3_0())
			{
				target_type_ = GL_TEXTURE_3D;
			}
			else
			{
				target_type_ = GL_TEXTURE_3D_OES;
			}
			break;

		case TT_Cube:
			target_type_ = GL_TEXTURE_CUBE_MAP;
			break;

		default:
			BOOST_ASSERT(false);
			target_type_ = GL_TEXTURE_2D;
			break;
		}

		glGenTextures(1, &texture_);
		glBindTexture(target_type_, texture_);
		glTexParameteri(target_type_, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(target_type_, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	}
예제 #2
0
static void uart_port_putchar(int port, unsigned char c)
{
	if (c == '\n')
		uart_port_putchar(port, '\r');
	while (!(inb(LSR(port)) & 0x20));
	outb(c, THR(port));
}
예제 #3
0
	// 枚举系统显卡
	/////////////////////////////////////////////////////////////////////////////////
	void D3D11AdapterList::Enumerate(IDXGIFactory1Ptr const & gi_factory)
	{
		// 枚举系统中的适配器
		UINT adapter_no = 0;
		IDXGIAdapter1* dxgi_adapter = nullptr;
		while (gi_factory->EnumAdapters1(adapter_no, &dxgi_adapter) != DXGI_ERROR_NOT_FOUND)
		{
			if (dxgi_adapter != nullptr)
			{
				DXGI_ADAPTER_DESC ad;
				dxgi_adapter->GetDesc(&ad);

				D3D11AdapterPtr adapter = MakeSharedPtr<D3D11Adapter>(adapter_no, MakeCOMPtr(dxgi_adapter));
				adapter->Enumerate();
				adapters_.push_back(adapter);
			}

			++ adapter_no;
		}

		// 如果没有找到兼容的设备则抛出错误
		if (adapters_.empty())
		{
			THR(errc::function_not_supported);
		}
	}
예제 #4
0
	void FrameBuffer::Detach(uint32_t att)
	{
		switch (att)
		{
		case ATT_DepthStencil:
			{
				rs_view_.reset();
			}
			break;

		default:
			{
				RenderEngine& re = Context::Instance().RenderFactoryInstance().RenderEngineInstance();
				if (att >= static_cast<uint32_t>(ATT_Color0 + re.DeviceCaps().max_simultaneous_rts))
				{
					THR(errc::function_not_supported);
				}

				uint32_t clr_id = att - ATT_Color0;
				if ((clr_views_.size() < clr_id + 1) && clr_views_[clr_id])
				{
					clr_views_[clr_id]->OnDetached(*this, att);
					clr_views_[clr_id].reset();
				}
			}
			break;
		}

		views_dirty_ = true;
	}
예제 #5
0
	// ╤оят
	inline void
	Verify(bool x)
	{
		if (!x)
		{
			THR(errc::function_not_supported);
		}
	}
/*
 * Output a single byte to the serial port.
 */
void serial_putc (const char c)
{
	/* wait for room in the tx FIFO on UART */
	while ((LSR(CONFIG_SYS_IXP425_CONSOLE) & LSR_TEMT) == 0);

	THR(CONFIG_SYS_IXP425_CONSOLE) = c;

	/* If \n, also do \r */
	if (c == '\n')
		serial_putc ('\r');
}
예제 #7
0
	void OGLTexture::BuildMipSubLevels()
	{
		if (glloader_GL_EXT_framebuffer_object())
		{
			this->GLBindTexture();
			glGenerateMipmapEXT(target_type_);
		}
		else
		{
			THR(errc::function_not_supported);
		}
	}
예제 #8
0
OGLESTexture::OGLESTexture(TextureType type, uint32_t array_size, uint32_t sample_count, uint32_t sample_quality, uint32_t access_hint)
    : Texture(type, sample_count, sample_quality, access_hint)
{
    if (array_size > 1)
    {
        THR(errc::function_not_supported);
    }

    switch (type_)
    {
    case TT_1D:
    case TT_2D:
        target_type_ = GL_TEXTURE_2D;
        break;

    case TT_3D:
        if (!glloader_GLES_VERSION_3_0() && !glloader_GLES_OES_texture_3D())
        {
            THR(errc::function_not_supported);
        }
        if (glloader_GLES_VERSION_3_0())
        {
            target_type_ = GL_TEXTURE_3D;
        }
        else
        {
            target_type_ = GL_TEXTURE_3D_OES;
        }
        break;

    case TT_Cube:
        target_type_ = GL_TEXTURE_CUBE_MAP;
        break;

    default:
        BOOST_ASSERT(false);
        target_type_ = GL_TEXTURE_2D;
        break;
    }
}
예제 #9
0
	OGLESTexture2DRenderView::OGLESTexture2DRenderView(Texture& texture_2d, int array_index, int level)
		: texture_2d_(*checked_cast<OGLESTexture2D*>(&texture_2d)),
			array_index_(array_index), level_(level)
	{
		BOOST_ASSERT(Texture::TT_2D == texture_2d.Type());

		if (array_index > 0)
		{
			THR(errc::function_not_supported);
		}

		uint32_t const channels = NumComponents(texture_2d.Format());
		if (((1 == channels) || (2 == channels)) && (!(glloader_GLES_VERSION_3_0() || glloader_GLES_EXT_texture_rg())))
		{
			THR(errc::function_not_supported);
		}

		tex_ = texture_2d_.GLTexture();

		width_ = texture_2d_.Width(level);
		height_ = texture_2d_.Height(level);
		pf_ = texture_2d_.Format();
	}
예제 #10
0
	OGLTexture::OGLTexture(TextureType type, uint32_t array_size, uint32_t sample_count, uint32_t sample_quality, uint32_t access_hint)
					: Texture(type, sample_count, sample_quality, access_hint)
	{
		array_size_ = array_size;

		if ((array_size > 1) && (!(glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_array())))
		{
			THR(errc::function_not_supported);
		}

		switch (type_)
		{
		case TT_1D:
			if (array_size > 1)
			{
				target_type_ = GL_TEXTURE_1D_ARRAY;
			}
			else
			{
				target_type_ = GL_TEXTURE_1D;
			}
			break;

		case TT_2D:
			if (array_size > 1)
			{
				target_type_ = GL_TEXTURE_2D_ARRAY;
			}
			else
			{
				target_type_ = GL_TEXTURE_2D;
			}
			break;

		case TT_3D:
			target_type_ = GL_TEXTURE_3D;
			break;

		case TT_Cube:
			target_type_ = GL_TEXTURE_CUBE_MAP;
			break;

		default:
			BOOST_ASSERT(false);
			target_type_ = GL_TEXTURE_1D;
			break;
		}
	}
예제 #11
0
	void FrameBuffer::DetachUAV(uint32_t att)
	{
		RenderEngine& re = Context::Instance().RenderFactoryInstance().RenderEngineInstance();
		if (att >= static_cast<uint32_t>(ATT_Color0 + re.DeviceCaps().max_simultaneous_rts))
		{
			THR(errc::function_not_supported);
		}

		if ((ua_views_.size() < att + 1) && ua_views_[att])
		{
			ua_views_[att]->OnDetached(*this, att);
			ua_views_[att].reset();
		}

		views_dirty_ = true;
	}
예제 #12
0
	OGLESDepthStencilRenderView::OGLESDepthStencilRenderView(Texture& texture, int array_index, int level)
		: target_type_(checked_cast<OGLESTexture2D*>(&texture)->GLType()), array_index_(array_index), level_(level)
	{
		BOOST_ASSERT(Texture::TT_2D == texture.Type());
		BOOST_ASSERT(IsDepthFormat(texture.Format()));

		if (array_index > 0)
		{
			THR(errc::function_not_supported);
		}

		width_ = texture.Width(level);
		height_ = texture.Height(level);
		pf_ = texture.Format();

		tex_ = checked_cast<OGLESTexture2D*>(&texture)->GLTexture();
	}
예제 #13
0
파일: yam.c 프로젝트: 383530895/linux
static int fpga_write(int iobase, unsigned char wrd)
{
	unsigned char bit;
	int k;
	unsigned long timeout = jiffies + HZ / 10;

	for (k = 0; k < 8; k++) {
		bit = (wrd & 0x80) ? (MCR_RTS | MCR_DTR) : MCR_DTR;
		outb(bit | MCR_OUT1 | MCR_OUT2, MCR(iobase));
		wrd <<= 1;
		outb(0xfc, THR(iobase));
		while ((inb(LSR(iobase)) & LSR_TSRE) == 0)
			if (time_after(jiffies, timeout))
				return -1;
	}

	return 0;
}
예제 #14
0
	OGLESTextureCubeDepthStencilRenderView::OGLESTextureCubeDepthStencilRenderView(Texture& texture_cube, int array_index, Texture::CubeFaces face, int level)
		: texture_cube_(*checked_cast<OGLESTextureCube*>(&texture_cube)),
			face_(face), level_(level)
	{
		BOOST_ASSERT(Texture::TT_Cube == texture_cube.Type());
		BOOST_ASSERT(IsDepthFormat(texture_cube.Format()));

		if (array_index > 0)
		{
			THR(errc::function_not_supported);
		}

		width_ = texture_cube.Width(level);
		height_ = texture_cube.Height(level);
		pf_ = texture_cube.Format();

		tex_ = checked_cast<OGLESTextureCube*>(&texture_cube)->GLTexture();
	}
예제 #15
0
static inline void ser12_set_divisor(struct net_device *dev,
				     unsigned char divisor)
{
	outb(0x81, LCR(dev->base_addr));	/* DLAB = 1 */
	outb(divisor, DLL(dev->base_addr));
	outb(0, DLM(dev->base_addr));
	outb(0x01, LCR(dev->base_addr));	/* word length = 6 */
	/*
	 * make sure the next interrupt is generated;
	 * 0 must be used to power the modem; the modem draws its
	 * power from the TxD line
	 */
	outb(0x00, THR(dev->base_addr));
	/*
	 * it is important not to set the divider while transmitting;
	 * this reportedly makes some UARTs generating interrupts
	 * in the hundredthousands per second region
	 * Reported by: [email protected] (Ignacio Arenaza Nuno)
	 */
}
예제 #16
0
	OGLESTextureCubeRenderView::OGLESTextureCubeRenderView(Texture& texture_cube, int array_index, Texture::CubeFaces face, int level)
		: texture_cube_(*checked_cast<OGLESTextureCube*>(&texture_cube)),
			face_(face), level_(level)
	{
		UNREF_PARAM(array_index);

		BOOST_ASSERT(Texture::TT_Cube == texture_cube.Type());
		BOOST_ASSERT(0 == array_index);

		uint32_t const channels = NumComponents(texture_cube.Format());
		if (((1 == channels) || (2 == channels)) && (!(glloader_GLES_VERSION_3_0() || glloader_GLES_EXT_texture_rg())))
		{
			THR(errc::function_not_supported);
		}

		tex_ = texture_cube_.GLTexture();

		width_ = texture_cube_.Width(level);
		height_ = texture_cube_.Height(level);
		pf_ = texture_cube_.Format();
	}
예제 #17
0
	OGLESTexture3DRenderView::OGLESTexture3DRenderView(Texture& texture_3d, int array_index, uint32_t slice, int level)
		: texture_3d_(*checked_cast<OGLESTexture3D*>(&texture_3d)),
			slice_(slice), level_(level), copy_to_tex_(0)
	{
		UNREF_PARAM(array_index);

		BOOST_ASSERT(Texture::TT_3D == texture_3d.Type());
		BOOST_ASSERT(texture_3d_.Depth(level) > slice);
		BOOST_ASSERT(0 == array_index);

		uint32_t const channels = NumComponents(texture_3d.Format());
		if (((1 == channels) || (2 == channels)) && (!(glloader_GLES_VERSION_3_0() || glloader_GLES_EXT_texture_rg())))
		{
			THR(errc::function_not_supported);
		}

		tex_ = texture_3d_.GLTexture();

		width_ = texture_3d_.Width(level);
		height_ = texture_3d_.Height(level);
		pf_ = texture_3d_.Format();
	}
예제 #18
0
	void OGLMapping::Mapping(GLenum& primType, uint32_t& primCount, RenderLayout const & rl)
	{
		uint32_t const vertexCount = static_cast<uint32_t>(rl.UseIndices() ? rl.NumIndices() : rl.NumVertices());
		primType = GL_POINTS;
		primCount = vertexCount;
		switch (rl.TopologyType())
		{
		case RenderLayout::TT_PointList:
			primType = GL_POINTS;
			primCount = vertexCount;
			break;

		case RenderLayout::TT_LineList:
			primType = GL_LINES;
			primCount = vertexCount / 2;
			break;

		case RenderLayout::TT_LineStrip:
			primType = GL_LINE_STRIP;
			primCount = vertexCount - 1;
			break;

		case RenderLayout::TT_TriangleList:
			primType = GL_TRIANGLES;
			primCount = vertexCount / 3;
			break;

		case RenderLayout::TT_TriangleStrip:
			primType = GL_TRIANGLE_STRIP;
			primCount = vertexCount - 2;
			break;

		default:
			THR(errc::function_not_supported);
		}
	}
예제 #19
0
	void FrameBuffer::AttachUAV(uint32_t att, UnorderedAccessViewPtr const & view)
	{
		RenderEngine& re = Context::Instance().RenderFactoryInstance().RenderEngineInstance();
		if (att >= static_cast<uint32_t>(re.DeviceCaps().max_simultaneous_uavs))
		{
			THR(errc::function_not_supported);
		}

		if ((att < ua_views_.size()) && ua_views_[att])
		{
			this->DetachUAV(att);
		}

		if (ua_views_.size() < att + 1)
		{
			ua_views_.resize(att + 1);
		}

		ua_views_[att] = view;

		view->OnAttached(*this, att);

		views_dirty_ = true;
	}
예제 #20
0
파일: yam.c 프로젝트: 383530895/linux
static void yam_tx_byte(struct net_device *dev, struct yam_port *yp)
{
	struct sk_buff *skb;
	unsigned char b, temp;

	switch (yp->tx_state) {
	case TX_OFF:
		break;
	case TX_HEAD:
		if (--yp->tx_count <= 0) {
			if (!(skb = skb_dequeue(&yp->send_queue))) {
				ptt_off(dev);
				yp->tx_state = TX_OFF;
				break;
			}
			yp->tx_state = TX_DATA;
			if (skb->data[0] != 0) {
/*                              do_kiss_params(s, skb->data, skb->len); */
				dev_kfree_skb_any(skb);
				break;
			}
			yp->tx_len = skb->len - 1;	/* strip KISS byte */
			if (yp->tx_len >= YAM_MAX_FRAME || yp->tx_len < 2) {
        			dev_kfree_skb_any(skb);
				break;
			}
			skb_copy_from_linear_data_offset(skb, 1,
							 yp->tx_buf,
							 yp->tx_len);
			dev_kfree_skb_any(skb);
			yp->tx_count = 0;
			yp->tx_crcl = 0x21;
			yp->tx_crch = 0xf3;
			yp->tx_state = TX_DATA;
		}
		break;
	case TX_DATA:
		b = yp->tx_buf[yp->tx_count++];
		outb(b, THR(dev->base_addr));
		temp = yp->tx_crcl;
		yp->tx_crcl = chktabl[temp] ^ yp->tx_crch;
		yp->tx_crch = chktabh[temp] ^ b;
		if (yp->tx_count >= yp->tx_len) {
			yp->tx_state = TX_CRC1;
		}
		break;
	case TX_CRC1:
		yp->tx_crch = chktabl[yp->tx_crcl] ^ yp->tx_crch;
		yp->tx_crcl = chktabh[yp->tx_crcl] ^ chktabl[yp->tx_crch] ^ 0xff;
		outb(yp->tx_crcl, THR(dev->base_addr));
		yp->tx_state = TX_CRC2;
		break;
	case TX_CRC2:
		outb(chktabh[yp->tx_crch] ^ 0xFF, THR(dev->base_addr));
		if (skb_queue_empty(&yp->send_queue)) {
			yp->tx_count = (yp->bitrate * yp->txtail) / 8000;
			if (yp->dupmode == 2)
				yp->tx_count += (yp->bitrate * yp->holdd) / 8;
			if (yp->tx_count == 0)
				yp->tx_count = 1;
			yp->tx_state = TX_TAIL;
		} else {
			yp->tx_count = 1;
			yp->tx_state = TX_HEAD;
		}
		++dev->stats.tx_packets;
		break;
	case TX_TAIL:
		if (--yp->tx_count <= 0) {
			yp->tx_state = TX_OFF;
			ptt_off(dev);
		}
		break;
	}
}
예제 #21
0
	OGLESRenderWindow::OGLESRenderWindow(std::string const & name, RenderSettings const & settings)
						: OGLESFrameBuffer(false)
	{
		// Store info
		name_				= name;
		width_				= settings.width;
		height_				= settings.height;
		isFullScreen_		= settings.full_screen;
		color_bits_			= NumFormatBits(settings.color_fmt);

		WindowPtr const & main_wnd = Context::Instance().AppInstance().MainWnd();		
		on_paint_connect_ = main_wnd->OnPaint().connect(bind(&OGLESRenderWindow::OnPaint, this,
			placeholders::_1));
		on_exit_size_move_connect_ = main_wnd->OnExitSizeMove().connect(bind(&OGLESRenderWindow::OnExitSizeMove, this,
			placeholders::_1));
		on_size_connect_ = main_wnd->OnSize().connect(bind(&OGLESRenderWindow::OnSize, this,
			placeholders::_1, placeholders::_2));
		on_close_connect_ = main_wnd->OnClose().connect(bind(&OGLESRenderWindow::OnClose, this,
			placeholders::_1));

		if (isFullScreen_)
		{
			left_ = 0;
			top_ = 0;
		}
		else
		{
			top_ = settings.top;
			left_ = settings.left;
		}

		display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);

		int r_size, g_size, b_size, a_size, d_size, s_size;
		switch (settings.color_fmt)
		{
		case EF_ARGB8:
		case EF_ABGR8:
			r_size = 8;
			g_size = 8;
			b_size = 8;
			a_size = 8;
			break;

		case EF_A2BGR10:
			r_size = 10;
			g_size = 10;
			b_size = 10;
			a_size = 2;
			break;

		default:
			BOOST_ASSERT(false);
			break;
		}
		switch (settings.depth_stencil_fmt)
		{
		case EF_D16:
			d_size = 16;
			s_size = 0;
			break;

		case EF_D24S8:
			d_size = 24;
			s_size = 8;
			break;

		case EF_D32F:
			d_size = 32;
			s_size = 0;
			break;

		default:
			d_size = 0;
			s_size = 0;
			break;
		}

		std::vector<EGLint> visual_attr;
		visual_attr.push_back(EGL_RENDERABLE_TYPE);
		visual_attr.push_back(EGL_OPENGL_ES3_BIT_KHR);
		visual_attr.push_back(EGL_RED_SIZE);
		visual_attr.push_back(r_size);
		visual_attr.push_back(EGL_GREEN_SIZE);
		visual_attr.push_back(g_size);
		visual_attr.push_back(EGL_BLUE_SIZE);
		visual_attr.push_back(b_size);
		visual_attr.push_back(EGL_ALPHA_SIZE);
		visual_attr.push_back(a_size);
		if (d_size > 0)
		{
			visual_attr.push_back(EGL_DEPTH_SIZE);
			visual_attr.push_back(d_size);
		}
		if (s_size > 0)
		{
			visual_attr.push_back(EGL_STENCIL_SIZE);
			visual_attr.push_back(s_size);
		}
		if (settings.sample_count > 1)
		{
			visual_attr.push_back(EGL_SAMPLES);
			visual_attr.push_back(settings.sample_count);
		}
		visual_attr.push_back(EGL_NONE);				// end of list

		EGLint major_ver, minor_ver;
		EGLint num_cfgs;
		eglInitialize(display_, &major_ver, &minor_ver);
		eglGetConfigs(display_, nullptr, 0, &num_cfgs);

#if !defined(KLAYGE_PLATFORM_ANDROID) || (__ANDROID_API__ >= 18)
		if (!eglChooseConfig(display_, &visual_attr[0], &cfg_, 1, &num_cfgs))
#endif
		{
			visual_attr[1] = EGL_OPENGL_ES2_BIT;
			eglChooseConfig(display_, &visual_attr[0], &cfg_, 1, &num_cfgs);
		}

		NativeWindowType wnd;
#if defined KLAYGE_PLATFORM_WINDOWS
		wnd = hWnd_ = main_wnd->HWnd();
		hDC_ = ::GetDC(hWnd_);
#elif defined KLAYGE_PLATFORM_LINUX
		wnd = x_window_ = main_wnd->XWindow();
#elif defined KLAYGE_PLATFORM_ANDROID
		wnd = a_window_ = main_wnd->AWindow();
		EGLint format;
		eglGetConfigAttrib(display_, cfg_, EGL_NATIVE_VISUAL_ID, &format);
		ANativeWindow_setBuffersGeometry(wnd, 0, 0, format);
#endif

		surf_ = eglCreateWindowSurface(display_, cfg_, wnd, nullptr);

		EGLint ctx_attr[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
#if !defined(KLAYGE_PLATFORM_ANDROID) || (__ANDROID_API__ >= 18)
		context_ = eglCreateContext(display_, cfg_, EGL_NO_CONTEXT, ctx_attr);
		if (nullptr == context_)
#endif
		{
			ctx_attr[1] = 2;
			context_ = eglCreateContext(display_, cfg_, EGL_NO_CONTEXT, ctx_attr);
		}
   
		eglMakeCurrent(display_, surf_, surf_, context_);

		if (!glloader_GLES_VERSION_2_0())
		{
			THR(errc::function_not_supported);
		}

		eglSwapInterval(display_, 0);

		glPixelStorei(GL_PACK_ALIGNMENT, 1);
		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

		viewport_->left = 0;
		viewport_->top = 0;
		viewport_->width = width_;
		viewport_->height = height_;

		std::wstring vendor, renderer, version;
		Convert(vendor, reinterpret_cast<char const *>(glGetString(GL_VENDOR)));
		Convert(renderer, reinterpret_cast<char const *>(glGetString(GL_RENDERER)));
		Convert(version, reinterpret_cast<char const *>(glGetString(GL_VERSION)));
		std::wostringstream oss;
		oss << vendor << L" " << renderer << L" " << version;
		if (settings.sample_count > 1)
		{
			oss << L" (" << settings.sample_count << L"x AA)";
		}
		description_ = oss.str();
	}
예제 #22
0
	void OGLMapping::MappingVertexFormat(GLenum& gltype, GLboolean& normalized, ElementFormat ef)
	{
		switch (ef)
		{
		case EF_A8:
		case EF_R8:
		case EF_GR8:
		case EF_BGR8:
		case EF_ARGB8:
		case EF_ABGR8:
			gltype = GL_UNSIGNED_BYTE;
			normalized = GL_TRUE;
			break;

		case EF_R8UI:
		case EF_GR8UI:
		case EF_BGR8UI:
		case EF_ABGR8UI:
			gltype = GL_UNSIGNED_BYTE;
			normalized = GL_FALSE;
			break;

		case EF_SIGNED_R8:
		case EF_SIGNED_GR8:
		case EF_SIGNED_BGR8:
		case EF_SIGNED_ABGR8:
			gltype = GL_BYTE;
			normalized = GL_TRUE;
			break;

		case EF_R8I:
		case EF_GR8I:
		case EF_BGR8I:
		case EF_ABGR8I:
			gltype = GL_BYTE;
			normalized = GL_FALSE;
			break;

		case EF_A2BGR10:
			gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
			normalized = GL_TRUE;
			break;

		case EF_SIGNED_A2BGR10:
			if (glloader_GL_VERSION_3_3() || glloader_GL_ARB_vertex_type_2_10_10_10_rev())
			{
				gltype = GL_INT_2_10_10_10_REV;
			}
			else
			{
				gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
			}
			normalized = GL_TRUE;
			break;

		case EF_R16:
		case EF_GR16:
		case EF_BGR16:
		case EF_ABGR16:
			gltype = GL_UNSIGNED_SHORT;
			normalized = GL_TRUE;
			break;

		case EF_R16UI:
		case EF_GR16UI:
		case EF_BGR16UI:
		case EF_ABGR16UI:
			gltype = GL_UNSIGNED_SHORT;
			normalized = GL_FALSE;
			break;

		case EF_SIGNED_R16:
		case EF_SIGNED_GR16:
		case EF_SIGNED_BGR16:
		case EF_SIGNED_ABGR16:
			gltype = GL_SHORT;
			normalized = GL_TRUE;
			break;

		case EF_R16I:
		case EF_GR16I:
		case EF_BGR16I:
		case EF_ABGR16I:
			gltype = GL_SHORT;
			normalized = GL_FALSE;
			break;

		case EF_R32UI:
		case EF_GR32UI:
		case EF_BGR32UI:
		case EF_ABGR32UI:
			gltype = GL_UNSIGNED_INT;
			normalized = GL_FALSE;
			break;

		case EF_R32I:
		case EF_GR32I:
		case EF_BGR32I:
		case EF_ABGR32I:
			gltype = GL_INT;
			normalized = GL_FALSE;
			break;

		case EF_R16F:
		case EF_GR16F:
		case EF_BGR16F:
		case EF_ABGR16F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				gltype = GL_HALF_FLOAT_ARB;
			}
			else
			{
				gltype = GL_FLOAT;
			}
			normalized = GL_FALSE;
			break;

		case EF_B10G11R11F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_packed_float())
			{
				gltype = GL_UNSIGNED_INT_10F_11F_11F_REV;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			normalized = GL_FALSE;
			break;

		case EF_R32F:
		case EF_GR32F:
		case EF_BGR32F:
		case EF_ABGR32F:
			gltype = GL_FLOAT;
			normalized = GL_FALSE;
			break;

		default:
			THR(errc::function_not_supported);
		}
	}
예제 #23
0
	void OGLMapping::MappingFormat(GLint& internalFormat, GLenum& glformat, GLenum& gltype, ElementFormat ef)
	{
		switch (ef)
		{
		case EF_A8:
			internalFormat = GL_ALPHA8;
			glformat = GL_ALPHA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_R5G6B5:
			internalFormat = GL_RGB565;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_SHORT_5_6_5_REV;
			break;

		case EF_A1RGB5:
			internalFormat = GL_RGB5_A1;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
			break;

		case EF_ARGB4:
			internalFormat = GL_RGBA4;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_SHORT_4_4_4_4_REV;
			break;

		case EF_R8:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_R8;
				glformat = GL_RED;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				internalFormat = GL_LUMINANCE8;
				glformat = GL_LUMINANCE;
				gltype = GL_UNSIGNED_BYTE;
			}
			break;

		case EF_SIGNED_R8:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_R8;
				glformat = GL_RED;
				gltype = GL_BYTE;
			}
			else
			{
				internalFormat = GL_LUMINANCE8;
				glformat = GL_LUMINANCE;
				gltype = GL_BYTE;
			}
			break;

		case EF_GR8:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_RG8;
				glformat = GL_RG;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_SIGNED_GR8:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_RG8;
				glformat = GL_RG;
				gltype = GL_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR8:
			internalFormat = GL_RGB8;
			glformat = GL_RGB;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_SIGNED_BGR8:
			if (glloader_GL_VERSION_3_1() || glloader_GL_EXT_texture_snorm())
			{
				internalFormat = GL_RGB8_SNORM;
				glformat = GL_RGB;
				gltype = GL_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ARGB8:
			internalFormat = GL_RGBA8;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
			break;

		case EF_ABGR8:
			internalFormat = GL_RGBA8;
			glformat = GL_RGBA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_SIGNED_ABGR8:
			if (glloader_GL_VERSION_3_1() || glloader_GL_EXT_texture_snorm())
			{
				internalFormat = GL_RGBA8_SNORM;
				glformat = GL_RGBA;
				gltype = GL_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_A2BGR10:
			internalFormat = GL_RGB10_A2;
			glformat = GL_RGBA;
			gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
			break;

		case EF_SIGNED_A2BGR10:
			internalFormat = GL_RGB10_A2;
			glformat = GL_RGBA;
			if (glloader_GL_VERSION_3_3() || glloader_GL_ARB_vertex_type_2_10_10_10_rev())
			{
				gltype = GL_INT_2_10_10_10_REV;
			}
			else
			{
				gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
			}
			break;

		case EF_R8UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_R8UI;
				glformat = GL_RED_INTEGER_EXT;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_R8I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_R8I;
				glformat = GL_RED_INTEGER_EXT;
				gltype = GL_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_GR8UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RG8UI;
				glformat = GL_RG_INTEGER;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_GR8I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RG8I;
				glformat = GL_RG_INTEGER;
				gltype = GL_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR8UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGB8UI;
				glformat = GL_RGB_INTEGER;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR8I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGB8I;
				glformat = GL_RGB_INTEGER;
				gltype = GL_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ABGR8UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGBA8UI;
				glformat = GL_RGBA_INTEGER;
				gltype = GL_UNSIGNED_INT_8_8_8_8;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ABGR8I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGBA8I;
				glformat = GL_RGBA_INTEGER;
				gltype = GL_UNSIGNED_INT_8_8_8_8;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_R16:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_R16;
				glformat = GL_RED;
				gltype = GL_UNSIGNED_SHORT;
			}
			else
			{
				internalFormat = GL_LUMINANCE16;
				glformat = GL_LUMINANCE;
				gltype = GL_UNSIGNED_SHORT;
			}
			break;

		case EF_SIGNED_R16:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_R16;
				glformat = GL_RED;
				gltype = GL_SHORT;
			}
			else
			{
				internalFormat = GL_LUMINANCE16;
				glformat = GL_LUMINANCE;
				gltype = GL_SHORT;
			}
			break;

		case EF_GR16:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_RG16;
				glformat = GL_RG;
				gltype = GL_UNSIGNED_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_SIGNED_GR16:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_RG16;
				glformat = GL_RG;
				gltype = GL_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR16:
			internalFormat = GL_RGB16;
			glformat = GL_RGB;
			gltype = GL_UNSIGNED_SHORT;
			break;

		case EF_SIGNED_BGR16:
			internalFormat = GL_RGB16;
			glformat = GL_RGB;
			gltype = GL_SHORT;
			break;

		case EF_ABGR16:
			internalFormat = GL_RGBA16;
			glformat = GL_RGBA;
			gltype = GL_UNSIGNED_SHORT;
			break;

		case EF_SIGNED_ABGR16:
			internalFormat = GL_RGBA16;
			glformat = GL_RGBA;
			gltype = GL_SHORT;
			break;

		case EF_R16UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_R16UI;
				glformat = GL_RED_INTEGER_EXT;
				gltype = GL_UNSIGNED_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_R16I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_R16I;
				glformat = GL_RED_INTEGER_EXT;
				gltype = GL_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_GR16UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RG16UI;
				glformat = GL_RG_INTEGER;
				gltype = GL_UNSIGNED_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_GR16I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RG16I;
				glformat = GL_RG_INTEGER;
				gltype = GL_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR16UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGB16UI;
				glformat = GL_RGB_INTEGER;
				gltype = GL_UNSIGNED_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR16I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGB16I;
				glformat = GL_RGB_INTEGER;
				gltype = GL_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ABGR16UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGBA16UI;
				glformat = GL_RGBA_INTEGER;
				gltype = GL_UNSIGNED_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ABGR16I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGBA16I;
				glformat = GL_RGBA_INTEGER;
				gltype = GL_SHORT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_R32UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_R32UI;
				glformat = GL_RED_INTEGER_EXT;
				gltype = GL_UNSIGNED_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_R32I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_R32I;
				glformat = GL_RED_INTEGER_EXT;
				gltype = GL_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_GR32UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RG32UI;
				glformat = GL_RG_INTEGER;
				gltype = GL_UNSIGNED_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_GR32I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RG32I;
				glformat = GL_RG_INTEGER;
				gltype = GL_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR32UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGB32UI;
				glformat = GL_RGB_INTEGER;
				gltype = GL_UNSIGNED_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR32I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGB32I;
				glformat = GL_RGB_INTEGER;
				gltype = GL_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ABGR32UI:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGBA32UI;
				glformat = GL_RGBA_INTEGER;
				gltype = GL_UNSIGNED_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_ABGR32I:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_texture_integer())
			{
				internalFormat = GL_RGBA32I;
				glformat = GL_RGBA_INTEGER;
				gltype = GL_INT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_R16F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_R16F;
				glformat = GL_RED;
				gltype = GL_HALF_FLOAT_ARB;
			}
			else
			{
				internalFormat = GL_LUMINANCE16F_ARB;
				glformat = GL_LUMINANCE;
				gltype = GL_HALF_FLOAT_ARB;
			}
			break;

		case EF_GR16F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_RG16F;
				glformat = GL_RG;
				gltype = GL_HALF_FLOAT_ARB;
			}
			else
			{
				internalFormat = GL_LUMINANCE_ALPHA16F_ARB;
				glformat = GL_LUMINANCE_ALPHA;
				gltype = GL_FLOAT;
			}
			break;

		case EF_B10G11R11F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_EXT_packed_float())
			{
				internalFormat = GL_R11F_G11F_B10F;
				glformat = GL_RGB;
				gltype = GL_UNSIGNED_INT_10F_11F_11F_REV;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BGR16F:
			internalFormat = GL_RGB16F_ARB;
			glformat = GL_RGB;
			gltype = GL_HALF_FLOAT_ARB;
			break;

		case EF_ABGR16F:
			internalFormat = GL_RGBA16F_ARB;
			glformat = GL_RGBA;
			gltype = GL_HALF_FLOAT_ARB;
			break;

		case EF_R32F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_R32F;
				glformat = GL_RED;
				gltype = GL_FLOAT;
			}
			else
			{
				internalFormat = GL_LUMINANCE32F_ARB;
				glformat = GL_LUMINANCE;
				gltype = GL_FLOAT;
			}
			break;

		case EF_GR32F:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_rg())
			{
				internalFormat = GL_RG32F;
				glformat = GL_RG;
				gltype = GL_FLOAT;
			}
			else
			{
				internalFormat = GL_LUMINANCE_ALPHA32F_ARB;
				glformat = GL_LUMINANCE_ALPHA;
				gltype = GL_FLOAT;
			}
			break;

		case EF_BGR32F:
			internalFormat = GL_RGB32F_ARB;
			glformat = GL_RGB;
			gltype = GL_FLOAT;
			break;

		case EF_ABGR32F:
			internalFormat = GL_RGBA32F_ARB;
			glformat = GL_RGBA;
			gltype = GL_FLOAT;
			break;

		case EF_BC1:
			if (glloader_GL_EXT_texture_compression_s3tc())
			{
				internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
				glformat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BC2:
			if (glloader_GL_EXT_texture_compression_s3tc())
			{
				internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
				glformat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BC3:
			if (glloader_GL_EXT_texture_compression_s3tc())
			{
				internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
				glformat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BC4:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_compression_rgtc())
			{
				internalFormat = GL_COMPRESSED_RED_RGTC1;
				glformat = GL_COMPRESSED_LUMINANCE;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_BC5:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_compression_rgtc())
			{
				internalFormat = GL_COMPRESSED_RG_RGTC2;
				glformat = GL_COMPRESSED_LUMINANCE_ALPHA;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_SIGNED_BC4:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_compression_rgtc())
			{
				internalFormat = GL_COMPRESSED_SIGNED_RED_RGTC1;
				glformat = GL_COMPRESSED_LUMINANCE;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_SIGNED_BC5:
			if (glloader_GL_VERSION_3_0() || glloader_GL_ARB_texture_compression_rgtc())
			{
				internalFormat = GL_COMPRESSED_SIGNED_RG_RGTC2;
				glformat = GL_COMPRESSED_LUMINANCE_ALPHA;
				gltype = GL_UNSIGNED_BYTE;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_D16:
			internalFormat = GL_DEPTH_COMPONENT16;
			glformat = GL_DEPTH_COMPONENT;
			gltype = GL_UNSIGNED_SHORT;
			break;

		case EF_D24S8:
			if (glloader_GL_VERSION_3_0())
			{
				internalFormat = GL_DEPTH24_STENCIL8;
				glformat = GL_DEPTH_STENCIL;
				gltype = GL_UNSIGNED_INT_24_8;
			}
			else if (glloader_GL_EXT_packed_depth_stencil())
			{
				internalFormat = GL_DEPTH24_STENCIL8_EXT;
				glformat = GL_DEPTH_STENCIL_EXT;
				gltype = GL_UNSIGNED_INT_24_8_EXT;
			}
			else
			{
				THR(errc::function_not_supported);
			}
			break;

		case EF_D32F:
			internalFormat = GL_DEPTH_COMPONENT32F;
			glformat = GL_DEPTH_COMPONENT;
			gltype = GL_FLOAT;
			break;

		case EF_ARGB8_SRGB:
			internalFormat = GL_SRGB8_ALPHA8;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
			break;

		case EF_ABGR8_SRGB:
			internalFormat = GL_SRGB8_ALPHA8;
			glformat = GL_RGBA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_BC1_SRGB:
			internalFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_BC2_SRGB:
			internalFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_BC3_SRGB:
			internalFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
			glformat = GL_BGRA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_BC4_SRGB:
			internalFormat = GL_COMPRESSED_SLUMINANCE;
			glformat = GL_LUMINANCE;
			gltype = GL_UNSIGNED_BYTE;
			break;

		case EF_BC5_SRGB:
			internalFormat = GL_COMPRESSED_SLUMINANCE_ALPHA;
			glformat = GL_LUMINANCE_ALPHA;
			gltype = GL_UNSIGNED_BYTE;
			break;

		default:
			THR(errc::function_not_supported);
		}
	}
예제 #24
0
	void FrameBuffer::Attach(uint32_t att, RenderViewPtr const & view)
	{
		switch (att)
		{
		case ATT_DepthStencil:
			{
				if (rs_view_)
				{
					this->Detach(att);
				}

				rs_view_ = view;
			}
			break;

		default:
			{
				BOOST_ASSERT(att >= ATT_Color0);

				RenderEngine& re = Context::Instance().RenderFactoryInstance().RenderEngineInstance();
				if (att >= static_cast<uint32_t>(ATT_Color0 + re.DeviceCaps().max_simultaneous_rts))
				{
					THR(errc::function_not_supported);
				}

				uint32_t clr_id = att - ATT_Color0;
				if ((clr_id < clr_views_.size()) && clr_views_[clr_id])
				{
					this->Detach(att);
				}

				if (clr_views_.size() < clr_id + 1)
				{
					clr_views_.resize(clr_id + 1);
				}

				clr_views_[clr_id] = view;
				size_t min_clr_index = clr_id;
				for (size_t i = 0; i < clr_id; ++ i)
				{
					if (clr_views_[i])
					{
						min_clr_index = i;
					}
				}
				if (min_clr_index == clr_id)
				{
					width_ = view->Width();
					height_ = view->Height();

					viewport_->left		= 0;
					viewport_->top		= 0;
					viewport_->width	= width_;
					viewport_->height	= height_;
				}
			}
			break;
		}

		view->OnAttached(*this, att);

		views_dirty_ = true;
	}
예제 #25
0
	void MsgInputEngine::EnumDevices()
	{
		WindowPtr const & main_wnd = Context::Instance().AppInstance().MainWnd();
#if defined KLAYGE_PLATFORM_WINDOWS_DESKTOP
		HWND hwnd = main_wnd->HWnd();
			
		UINT devices = 0;
		if (::GetRawInputDeviceList(nullptr, &devices, sizeof(RAWINPUTDEVICELIST)) != 0)
		{
			THR(errc::function_not_supported);
		}

		std::vector<RAWINPUTDEVICELIST> raw_input_devices(devices);
		::GetRawInputDeviceList(&raw_input_devices[0], &devices, sizeof(raw_input_devices[0]));

		RAWINPUTDEVICE rid;
		rid.usUsagePage = HID_USAGE_PAGE_GENERIC;
		rid.hwndTarget = hwnd;
		std::vector<RAWINPUTDEVICE> rids;
		for (size_t i = 0; i < raw_input_devices.size(); ++ i)
		{
			InputDevicePtr device;
			switch (raw_input_devices[i].dwType)
			{
			case RIM_TYPEKEYBOARD:
				device = MakeSharedPtr<MsgInputKeyboard>();
				rid.usUsage = HID_USAGE_GENERIC_KEYBOARD;
				rid.dwFlags = 0;
				rids.push_back(rid);
				break;

			case RIM_TYPEMOUSE:
				device = MakeSharedPtr<MsgInputMouse>(hwnd, raw_input_devices[i].hDevice);
				rid.usUsage = HID_USAGE_GENERIC_MOUSE;
				rid.dwFlags = 0;
				rids.push_back(rid);
				break;

			case RIM_TYPEHID:
				{
					UINT size = 0;
					if (0 == ::GetRawInputDeviceInfo(raw_input_devices[i].hDevice, RIDI_DEVICEINFO, nullptr, &size))
					{
						std::vector<uint8_t> buf(size);
						::GetRawInputDeviceInfo(raw_input_devices[i].hDevice, RIDI_DEVICEINFO, &buf[0], &size);

						RID_DEVICE_INFO* info = reinterpret_cast<RID_DEVICE_INFO*>(&buf[0]);
						if ((HID_USAGE_PAGE_GENERIC == info->hid.usUsagePage)
							&& ((HID_USAGE_GENERIC_GAMEPAD == info->hid.usUsage)
								|| (HID_USAGE_GENERIC_JOYSTICK == info->hid.usUsage)))
						{
							device = MakeSharedPtr<MsgInputJoystick>(raw_input_devices[i].hDevice);
							rid.usUsage = HID_USAGE_GENERIC_GAMEPAD;
							rid.dwFlags = RIDEV_INPUTSINK;
							rids.push_back(rid);
							rid.usUsage = HID_USAGE_GENERIC_JOYSTICK;
							rid.dwFlags = RIDEV_INPUTSINK;
							rids.push_back(rid);
						}
					}
				}
				break;

			default:
				break;
			}
			
			if (device)
			{
				devices_.push_back(device);
			}
		}

		if (::RegisterRawInputDevices(&rids[0], static_cast<UINT>(rids.size()), sizeof(rids[0])))
		{
			on_raw_input_ = main_wnd->OnRawInput().connect(bind(&MsgInputEngine::OnRawInput, this,
				std::placeholders::_1, std::placeholders::_2));
		}
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
		on_pointer_down_ = main_wnd->OnPointerDown().connect(std::bind(&MsgInputEngine::OnPointerDown, this,
			std::placeholders::_2, std::placeholders::_3));
		on_pointer_up_ = main_wnd->OnPointerUp().connect(std::bind(&MsgInputEngine::OnPointerUp, this,
			std::placeholders::_2, std::placeholders::_3));
		on_pointer_update_ = main_wnd->OnPointerUpdate().connect(std::bind(&MsgInputEngine::OnPointerUpdate, this,
			std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
		on_pointer_wheel_ = main_wnd->OnPointerWheel().connect(std::bind(&MsgInputEngine::OnPointerWheel, this,
			std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
		devices_.push_back(MakeSharedPtr<MsgInputTouch>());
#elif (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
		if (::GetSystemMetrics(SM_DIGITIZER) & NID_READY)
		{
			if (this->RegisterTouchWindow(hwnd, TWF_WANTPALM))
			{
				on_touch_ = main_wnd->OnTouch().connect(std::bind(&MsgInputEngine::OnTouch, this,
					std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
				devices_.push_back(MakeSharedPtr<MsgInputTouch>());
			}
		}
#endif
#elif (defined KLAYGE_PLATFORM_WINDOWS_RUNTIME) || (defined KLAYGE_PLATFORM_ANDROID) || (defined KLAYGE_PLATFORM_DARWIN) || (defined KLAYGE_PLATFORM_IOS)
		on_pointer_down_ = main_wnd->OnPointerDown().connect(std::bind(&MsgInputEngine::OnPointerDown, this,
			std::placeholders::_2, std::placeholders::_3));
		on_pointer_up_ = main_wnd->OnPointerUp().connect(std::bind(&MsgInputEngine::OnPointerUp, this,
			std::placeholders::_2, std::placeholders::_3));
		on_pointer_update_ = main_wnd->OnPointerUpdate().connect(std::bind(&MsgInputEngine::OnPointerUpdate, this,
			std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
		on_pointer_wheel_ = main_wnd->OnPointerWheel().connect(std::bind(&MsgInputEngine::OnPointerWheel, this,
			std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
		devices_.push_back(MakeSharedPtr<MsgInputTouch>());
#if defined KLAYGE_PLATFORM_ANDROID
		on_key_down_ = main_wnd->OnKeyDown().connect(std::bind(&MsgInputEngine::OnKeyDown, this,
			std::placeholders::_2));
		on_key_up_ = main_wnd->OnKeyUp().connect(std::bind(&MsgInputEngine::OnKeyUp, this,
			std::placeholders::_2));
		devices_.push_back(MakeSharedPtr<MsgInputKeyboard>());

		on_mouse_down_ = main_wnd->OnMouseDown().connect(std::bind(&MsgInputEngine::OnMouseDown, this,
			std::placeholders::_2, std::placeholders::_3));
		on_mouse_up_ = main_wnd->OnMouseUp().connect(std::bind(&MsgInputEngine::OnMouseUp, this,
			std::placeholders::_2, std::placeholders::_3));
		on_mouse_move_ = main_wnd->OnMouseMove().connect(std::bind(&MsgInputEngine::OnMouseMove, this,
			std::placeholders::_2));
		on_mouse_wheel_ = main_wnd->OnMouseWheel().connect(std::bind(&MsgInputEngine::OnMouseWheel, this,
			std::placeholders::_2, std::placeholders::_3));
		devices_.push_back(MakeSharedPtr<MsgInputMouse>());

		on_joystick_axis_ = main_wnd->OnJoystickAxis().connect(std::bind(&MsgInputEngine::OnJoystickAxis, this,
			std::placeholders::_2, std::placeholders::_3));
		on_joystick_buttons_ = main_wnd->OnJoystickButtons().connect(std::bind(&MsgInputEngine::OnJoystickButtons, this,
			std::placeholders::_2));
		devices_.push_back(MakeSharedPtr<MsgInputJoystick>());
#elif defined KLAYGE_PLATFORM_DARWIN
		on_key_down_ = main_wnd->OnKeyDown().connect(std::bind(&MsgInputEngine::OnKeyDown, this,
			std::placeholders::_2));
		on_key_up_ = main_wnd->OnKeyUp().connect(std::bind(&MsgInputEngine::OnKeyUp, this,
			std::placeholders::_2));
		devices_.push_back(MakeSharedPtr<MsgInputKeyboard>());
#endif
#endif

#if (defined KLAYGE_PLATFORM_WINDOWS_DESKTOP) && (defined KLAYGE_HAVE_LIBOVR)
		OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All));
		devices_.push_back(MakeSharedPtr<MsgInputOVR>());
#endif

#if ((defined KLAYGE_PLATFORM_WINDOWS_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7) && (_WIN32_WINNT < _WIN32_WINNT_WIN10)) \
			|| (defined KLAYGE_PLATFORM_WINDOWS_RUNTIME) || (defined KLAYGE_PLATFORM_ANDROID)
		devices_.push_back(MakeSharedPtr<MsgInputSensor>());
#endif
	}
예제 #26
0
	OGLESTexture3D::OGLESTexture3D(uint32_t width, uint32_t height, uint32_t depth, uint32_t numMipMaps, uint32_t array_size, ElementFormat format,
							uint32_t sample_count, uint32_t sample_quality, uint32_t access_hint)
					: OGLESTexture(TT_3D, array_size, sample_count, sample_quality, access_hint)
	{
		if (!glloader_GLES_VERSION_3_0() && !glloader_GLES_OES_texture_3D())
		{
			THR(errc::function_not_supported);
		}

		if (IsSRGB(format))
		{
			format = this->SRGBToRGB(format);
		}

		format_ = format;

		if (0 == numMipMaps)
		{
			num_mip_maps_ = 1;
			uint32_t w = width;
			uint32_t h = height;
			uint32_t d = depth;
			while ((w > 1) && (h > 1) && (d > 1))
			{
				++ num_mip_maps_;

				w = std::max<uint32_t>(1U, w / 2);
				h = std::max<uint32_t>(1U, h / 2);
				d = std::max<uint32_t>(1U, d / 2);
			}
		}
		else
		{
			num_mip_maps_ = numMipMaps;
		}
		array_size_ = 1;

		width_ = width;
		height_ = height;
		depth_ = depth;

		tex_data_.resize(num_mip_maps_);

		glBindTexture(target_type_, texture_);
		if (glloader_GLES_VERSION_3_0())
		{
			glTexParameteri(target_type_, GL_TEXTURE_BASE_LEVEL, 0);
			glTexParameteri(target_type_, GL_TEXTURE_MAX_LEVEL, num_mip_maps_ - 1);
		}
		else if (glloader_GLES_APPLE_texture_max_level())
		{
			glTexParameteri(target_type_, GL_TEXTURE_MAX_LEVEL_APPLE, num_mip_maps_ - 1);
		}
		else
		{
			OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance());
			if (re.HackForTegra())
			{
				glTexParameteri(target_type_, GL_TEXTURE_MAX_LEVEL, num_mip_maps_ - 1);
			}
		}
	}