Bikeshed: Implementing a command queue.

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Mar 12 17:47:06 PST 2016


On Saturday, 12 March 2016 at 15:10:16 UTC, maik klein wrote:
> I wanted to implement a simple command queue in D. To give a 
> bit of context, I want to create a command queue for opengl. 
> Instead of interacting directly with opengl, you will create 
> commands, put them in a queue and then the renderer will read 
> those commands and execute the correct OpenGl calls.
>
>
> I have a few options:
>
> I could use an ADT to create commands but then all commands 
> would have the size of the biggest command, also Algebraic is 
> not nice nicest thing in D.
>
> I could use runtime polymorphism `class SomeCommand: Command{}` 
> but then I would end up with a lot of pointers in the queue, 
> also I would need to worry about the allocations.
>
> I have also seen this, but it is a bit more low level and is 
> similar to assembly.
>
> Queue:
> Command1
> int
> int
> Command2
> float
> Command3
> Command4
> int
> float double
>
> The first entry would always be the command which is followed 
> by the arguments. So you would pop the command out and with the 
> command you know how far you need to go into the queue
>
> //pseudo code
> auto c = queue.pop!Command;
>
> if(c == Command1){
>    int arg1 = queue.pop!int;
>    int arg2 = queue.pop!int;
> }
> if(c == Command2){
>    int arg1 = queue.pop!float;
>
> }
>
> How would you implement a simple command queue?

for the sake of simplicity I'm going to assume that the arguments 
to your commands are 32bit values ((u)int and float,) make the 
command type an enum : uint. if you are going to have 64bit 
values you will have to take care of alignment or waste space.
then have a "buffer" of 32bit value (circular is fine)
while(!buffer.empty)
{
     final switch(buffer.next32bitValue()) with(Command)
     {
         case command1:
         {
             Command1 cmd;
             cmd.firstInt      = cast(int)buffer.next32bitValue();
             cmd.secondInt = cast(int)buffer.next32bitValue();
             uint value = cast(int)buffer.next32bitValue();
             cmd.firstFloat   = *cast(float*)&value;
             glSomeCall(cmd);
             break;
         }
         ...
     }
}



More information about the Digitalmars-d-learn mailing list