Home | History | Annotate | Download | only in renderer
      1 #include "precompiled.h"
      2 //
      3 // Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
      4 // Use of this source code is governed by a BSD-style license that can be
      5 // found in the LICENSE file.
      6 //
      7 
      8 // ShaderExecutable11.cpp: Implements a D3D11-specific class to contain shader
      9 // executable implementation details.
     10 
     11 #include "libGLESv2/renderer/ShaderExecutable11.h"
     12 
     13 #include "common/debug.h"
     14 
     15 namespace rx
     16 {
     17 
     18 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11PixelShader *executable)
     19     : ShaderExecutable(function, length)
     20 {
     21     mPixelExecutable = executable;
     22     mVertexExecutable = NULL;
     23     mGeometryExecutable = NULL;
     24 
     25     mConstantBuffer = NULL;
     26 }
     27 
     28 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11VertexShader *executable)
     29     : ShaderExecutable(function, length)
     30 {
     31     mVertexExecutable = executable;
     32     mPixelExecutable = NULL;
     33     mGeometryExecutable = NULL;
     34 
     35     mConstantBuffer = NULL;
     36 }
     37 
     38 ShaderExecutable11::ShaderExecutable11(const void *function, size_t length, ID3D11GeometryShader *executable)
     39     : ShaderExecutable(function, length)
     40 {
     41     mGeometryExecutable = executable;
     42     mVertexExecutable = NULL;
     43     mPixelExecutable = NULL;
     44 
     45     mConstantBuffer = NULL;
     46 }
     47 
     48 ShaderExecutable11::~ShaderExecutable11()
     49 {
     50     if (mVertexExecutable)
     51     {
     52         mVertexExecutable->Release();
     53     }
     54     if (mPixelExecutable)
     55     {
     56         mPixelExecutable->Release();
     57     }
     58     if (mGeometryExecutable)
     59     {
     60         mGeometryExecutable->Release();
     61     }
     62 
     63     if (mConstantBuffer)
     64     {
     65         mConstantBuffer->Release();
     66     }
     67 }
     68 
     69 ShaderExecutable11 *ShaderExecutable11::makeShaderExecutable11(ShaderExecutable *executable)
     70 {
     71     ASSERT(HAS_DYNAMIC_TYPE(ShaderExecutable11*, executable));
     72     return static_cast<ShaderExecutable11*>(executable);
     73 }
     74 
     75 ID3D11VertexShader *ShaderExecutable11::getVertexShader() const
     76 {
     77     return mVertexExecutable;
     78 }
     79 
     80 ID3D11PixelShader *ShaderExecutable11::getPixelShader() const
     81 {
     82     return mPixelExecutable;
     83 }
     84 
     85 ID3D11GeometryShader *ShaderExecutable11::getGeometryShader() const
     86 {
     87     return mGeometryExecutable;
     88 }
     89 
     90 ID3D11Buffer *ShaderExecutable11::getConstantBuffer(ID3D11Device *device, unsigned int registerCount)
     91 {
     92     if (!mConstantBuffer && registerCount > 0)
     93     {
     94         D3D11_BUFFER_DESC constantBufferDescription = {0};
     95         constantBufferDescription.ByteWidth = registerCount * sizeof(float[4]);
     96         constantBufferDescription.Usage = D3D11_USAGE_DYNAMIC;
     97         constantBufferDescription.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
     98         constantBufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
     99         constantBufferDescription.MiscFlags = 0;
    100         constantBufferDescription.StructureByteStride = 0;
    101 
    102         HRESULT result = device->CreateBuffer(&constantBufferDescription, NULL, &mConstantBuffer);
    103         ASSERT(SUCCEEDED(result));
    104     }
    105 
    106     return mConstantBuffer;
    107 }
    108 
    109 }