111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri/**************************************************************************
211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * Copyright 2010 Luca Barbieri
411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining
611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * a copy of this software and associated documentation files (the
711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * "Software"), to deal in the Software without restriction, including
811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish,
911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to
1011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * permit persons to whom the Software is furnished to do so, subject to
1111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * the following conditions:
1211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
1311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * The above copyright notice and this permission notice (including the
1411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * next paragraph) shall be included in all copies or substantial
1511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * portions of the Software.
1611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
1711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
2511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri **************************************************************************/
2611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
2711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11app.h"
2811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11tri.hlsl.ps.h"
2911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11tri.hlsl.vs.h"
3011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
3111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieristruct vertex {
3211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri float position[4];
3311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri float color[4];
3411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri};
3511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
3611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieristatic struct vertex vertices[3] =
3711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
3811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri {
3911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	 { 0.0f, 0.9f, 0.5f, 1.0f },
4011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	 { 1.0f, 0.0f, 0.0f, 1.0f }
4111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri },
4211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri {
4311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	 { 0.9f, -0.9f, 0.5f, 1.0f },
4411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	 { 0.0f, 0.0f, 1.0f, 1.0f }
4511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri },
4611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri {
4711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	 { -0.9f, -0.9f, 0.5f, 1.0f },
4811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	 { 0.0f, 1.0f, 0.0f, 1.0f }
4911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri },
5011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri};
5111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
5211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieristruct d3d11tri : public d3d11_application
5311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
5411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11PixelShader* ps;
5511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11VertexShader* vs;
5611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11InputLayout* layout;
5711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11Buffer* vb;
5811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
5911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	virtual bool init(ID3D11Device* dev, int argc, char** argv)
6011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	{
6111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreatePixelShader(g_ps, sizeof(g_ps), NULL, &ps));
6211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateVertexShader(g_vs, sizeof(g_vs), NULL, &vs));
6311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
6411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_INPUT_ELEMENT_DESC elements[] =
6511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		{
6611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			// inverse order to make sure the implementation can properly parse the vertex shader signature
6711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0},
6811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			{"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
6911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		};
7011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
7111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateInputLayout(elements, sizeof(elements) / sizeof(elements[0]), g_vs, sizeof(g_vs), &layout));
7211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_BUFFER_DESC bufferd;
7311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.ByteWidth = sizeof(vertices);
7411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.Usage = D3D11_USAGE_IMMUTABLE;
7511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
7611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.CPUAccessFlags = 0;
7711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.MiscFlags = 0;
7811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.StructureByteStride = 0;
7911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
8011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_SUBRESOURCE_DATA buffersd;
8111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		buffersd.pSysMem = vertices;
8211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		buffersd.SysMemPitch = sizeof(vertices);
8311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		buffersd.SysMemSlicePitch = sizeof(vertices);
8411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
8511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateBuffer(&bufferd, &buffersd, &vb));
8611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
8711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		return true;
8811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	}
8911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
9011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	virtual void draw(ID3D11DeviceContext* ctx, ID3D11RenderTargetView* rtv, unsigned width, unsigned height, double time)
9111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	{
9211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		float clear_color[4] = {1, 0, 1, 1};
9311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_VIEWPORT vp;
9411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		memset(&vp, 0, sizeof(vp));
9511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		vp.Width = (float)width;
9611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		vp.Height = (float)height;
9711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		vp.MaxDepth = 1.0f;
9811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
9911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->OMSetRenderTargets(1, &rtv, 0);
10011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->RSSetViewports(1, &vp);
10111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
10211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->ClearRenderTargetView(rtv, clear_color);
10311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
10411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
10511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->IASetInputLayout(layout);
10611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		unsigned stride = 2 * 4 * 4;
10711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		unsigned offset = 0;
10811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->IASetVertexBuffers(0, 1, &vb, &stride, &offset);
10911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
11011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->VSSetShader(vs, NULL, 0);
11111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->PSSetShader(ps, NULL, 0);
11211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
11311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->Draw(3, 0);
11411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	}
11511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri};
11611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
11711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbierid3d11_application* d3d11_application_create()
11811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
11911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	return new d3d11tri();
12011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri}
121