#pragma once
#ifdef BKSCRDLL_EXPORTS
#define BKSCRDLL_API __declspec(dllexport)
#else
#define BKSCRDLL_API __declspec(dllimport)
#endif
/*
class CCritSec
{
public:

    CCritSec() :
        m_cs()
    {
        InitializeCriticalSection(&m_cs);
    }

    ~CCritSec()
    {
        DeleteCriticalSection(&m_cs);
    }

    _Acquires_lock_(this->m_cs)
        void Lock(void)
    {
        EnterCriticalSection(&m_cs);
    }

    _Releases_lock_(this->m_cs)
        void Unlock(void)
    {
        LeaveCriticalSection(&m_cs);
    }

private:

    CRITICAL_SECTION m_cs;
};

class CAutoLock
{
public:

    _Acquires_lock_(this->m_pLock->m_cs)
        CAutoLock(CCritSec* pLock) :
        m_pLock(pLock)
    {
        m_pLock->Lock();
    }

    _Releases_lock_(this->m_pLock->m_cs)
        ~CAutoLock(void)
    {
        m_pLock->Unlock();
    }

private:

    CCritSec * m_pLock;
};
*/

#include "Screen_Shared.h"
#include "LockVarType.h"
#include <d3d11_1.h>

EXTERN_C class BKSCRDLL_API CScreenD3D : public CBKScreen_Shared
{
	protected:
		LockVarType             m_lockDrawing;
		//CCritSec                m_critSec;                  // critical section for thread safety
		D3D11_VIEWPORT          m_vp;
		RECT                    m_rectWnWnd; //размеры viewporta в оконном режиме
		//left, top - координаты экрана, right, bottom - размеры, а не координаты!!!
		DXGI_MODE_DESC          m_fullScrMode;
		DXGI_MODE_DESC          m_windowMode;


		D3D_DRIVER_TYPE         g_driverType;           //Этот параметр указывает, производить вычисления в видеокарте или в центральном процессоре.
		D3D_FEATURE_LEVEL       g_featureLevel;         //Параметр, указывающий, какую версию DirectX поддерживает наша видеокарта.
		ID3D11Device           *g_pd3dDevice;           //интерфейс для создания ресурсов
		ID3D11Device1          *g_pd3dDevice1;
		ID3D11DeviceContext    *g_pImmediateContext;    //интерфейс для вывода графической информации
		ID3D11DeviceContext1   *g_pImmediateContext1;
		IDXGISwapChain         *g_pSwapChain;           //интерфейс для работы с буферами - задним и передним
		IDXGISwapChain1        *g_pSwapChain1;
		ID3D11RenderTargetView *g_pRenderTargetView;    //объект заднего буфера, в котором происходит отрисовка
//      ID3D11Texture2D*                    g_pDepthStencil;
//      ID3D11DepthStencilView*             g_pDepthStencilView;
		ID3D11VertexShader     *g_pVertexShader;
		ID3D11PixelShader      *g_pPixelShader;
		ID3D11InputLayout      *g_pVertexLayout;
		ID3D11Buffer           *g_pVertexBuffer;
		ID3D11Buffer                       *g_pCBNeverChanges;
//		ID3D11Buffer*                       g_pCBChangeOnResize;
//		ID3D11Buffer*                       g_pCBChangesEveryFrame;
		ID3D11Texture2D        *m_pTexture; // Наша текстура
		ID3D11ShaderResourceView           *g_pTextureRV;
		ID3D11SamplerState                 *g_pSamplerLinear;

	public:
		CScreenD3D();
		virtual ~CScreenD3D() override;

		virtual HRESULT     BKSS_ScreenView_Init(ScrsParams &sspar, CWnd *pwndScr, CWnd *pwndFullScr) override;
		virtual void        BKSS_ScreenView_Done() override;
		virtual void        BKSS_DrawScreen() override;
		virtual bool        BKSS_SetFullScreenMode() override;
		virtual bool        BKSS_SetWindowMode() override;

		virtual void        BKSS_OnSize(int cx, int cy) override;
};


